Java 异常处理 - 风格

标签 java exception-handling

从历史上看,我总是这样编写我的异常处理代码:

    Cursor cursor = null;
    try {
        cursor = db.openCursor(null, null);
        // do stuff
    } finally {
        if (cursor != null) cursor.close();
    }

但最近,出于可读性和懒惰的原因,我开始这样做:

        Cursor cursor = db.openCursor(null, null);
        try {           
            // do stuff
        } finally {
            cursor.close();
        }

在 try-catch-finally block 之外对游标(jdbc 句柄等)进行赋值是否错误?

除非 JVM 实际上在赋值时崩溃,或者在赋值和 try block 中任何内容的第一行之间我不确定我的旧风格是否提供了任何额外的值(value),而第二行肯定更具可读性简洁。文献generally不过总是选择第一种风格。

编辑 - 假设我很高兴在初始化游标时 openCursor 抛出的任何异常不会被这段代码捕获,我对此示例唯一关心的是关闭游标,如果它 < strong>被分配并打开。另外假设我正在测试空值等等......等等...... yadda ... yadda ...(我已经改变了这个例子来反射(reflect)这一点,这不是我的问题的重点所以我没有包含在第一个版本中)

最佳答案

我总是采用第二种方式,因为它允许我将光标设置为 final。如果您实际上没有尝试从中捕获异常,我没有理由认为在 try 子句中进行赋值。

编辑:请注意,根据正在进行的进一步讨论。这就是我处理 openCursor 调用抛出异常的方式:

try
{
    // ALLOCATE RESOURCE
    final Cursor cursor = db.openCursor(null, null);

    try
    {
        // USE RESOURCE
    }
    finally
    {
        // DISPOSE RESOURCE
        cursor.close();
    }
}
catch(OpenCursorException e)
{
    // Handle this appropriately.
}

注意分配、使用和处置的清晰分离。唯一有点有趣的是,如果使用 try block 抛出与您为分配 try block 捕获的相同的异常。 (IOException 将是一个特别好的例子,因为打开和读取都可以抛出一个异常。)在这种情况下,一切仍将正确清理和处理,但您可能错误地将失败归因于初始化异常而不是使用异常。在这种情况下,您需要在内部 try block 中捕获异常并立即在其中处理它们。

关于Java 异常处理 - 风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909662/

相关文章:

Java 不可能的谜题

asp.net - 无法找到程序集 - 无法追踪错误

Python:静态检测未处理的异常

Java 适本地处理异常

java - 在微调器中选择项目后,它没有反射(reflect)给我(肉眼不可见)

java - Spring Boot - 未加载 war 文件中的静态资源

java - 解析 SVG - java.net.MalformedURLException : no protocol: <? xml 版本 ="1.0"编码 ="UTF-8"独立 ="no"?>

java - 如何使用代码同步intellij中的当前文件?

scala - 为什么在 Scala 中应该更喜欢 Option 进行错误处理而不是异常?

c# - .NET 中的异常处理和日志记录策略