如果捕获引发异常,我应该如何处理它们?

时间:2015-04-16 12:25:28

标签: java exception exception-handling

我有一个简单的编码方案,如:

class A
{

    public static void main(String[] args) 
    { 
        try{
            //some exception
        }
        catch(Exception e)
        {
           //Again some exception
        }
        finally
        {
            System.out.println("Finally executed");
        }
    }
}

我的问题:

  1. 有没有办法处理catch中的异常?如果有,那怎么样?
  2. 如果finally块有异常怎么办,有什么方法可以处理它们吗?
  3. 或者在catch或finally块中有异常只是错误的编程习惯吗?

4 个答案:

答案 0 :(得分:2)

您可以按照以下方式处理它们......

class A
{
    public static void main(String excep[]) 
    { 
        try{
            //some exception
        }

        catch(Exception e)
        {
            //Again some exception
             try {}
             catch(Exception e){}
        }

        finally
        {
            System.out.println("Finally executed");
             try {}
             catch(Exception e){}
        }
    }
}

这通常在FileStream结束示例中完成,如下面的示例

所示
FileStream in = new FileStream(f);
finally {
if (input != null) {
   try {
     in.close();
   }catch (IOException exp) {
       System.out.println(exp);
    }
}

答案 1 :(得分:1)

1)有没有办法处理catch中的异常?如果有,那怎么样?的

您可以在try catch内使用其他catch()块,也可以抛出异常;

try {
            // some exception
        }

        catch (Exception e) {

            try {
                // Again some exception
                // some exception
            }

            catch (Exception e1) {
                // Again some exception
                throw new RuntimeException();//throwing a runtime exception, you can throw here your required exception
            }
        }

2)如果finally块有异常怎么办,有什么方法可以处理它们? 我就问题(1)进行了讨论。

3)或者在catch或finally块中有异常只是不好的编程习惯吗? 可能是

因为你需要捕获catch块中的所有异常,这是更好的方法。但是您可以使用另一个finally块来处理try catch块中的异常。

Try catch block

中finally块的示例代码
        finally {
            try {
                System.out.println("Finally executed");
            } catch (Exception final_ex) {
                // handle exception 
            }
        }

答案 2 :(得分:1)

1和2)是的,您可以通过嵌套try块或让异常被抛出来执行这两个操作(取决于具体情况)。

3)这是不错的做法,这是不可避免的

你应该注意一些事情。

一个潜在的问题是异常屏蔽。当你从catch或finally块中抛出异常时,它将取代任何原始异常。如果您有某种类型的Closeable,如InputStream或JDBC对象,您必须在finally块中关闭资源,如果您抛出该异常,则会丢失原始异常,告诉您实际出错的地方。

另一件需要考虑的事情是,对于你在finally块中抛出异常的情况,是否要让异常完全传播。对于JDBC示例,一旦事务已经提交,那么如果在关闭连接时抛出异常,它与业务逻辑无关,那只会令人讨厌。所以这种方法的一个常见方法是在finally块中捕获异常并记录它,但不要重新抛出它。

try-with-resources功能是尝试修复异常屏蔽。如果在try中抛出异常后抛出finally块中的异常,则关闭异常将添加到原始异常中,您可以通过Throwable#getSuppressed方法访问它。

try-with-resources还提供了一种避免try-finally块嵌套的方法,你可以声明多个closeable,它们将按顺序关闭,后进先出。

尝试使用资源抑制在关闭时抛出的异常只有在try块中抛出异常时才会起作用,否则关闭时抛出的异常会被传播。这种行为不同于捕获和记录关闭时抛出的任何东西的旧模式,这可以防止关闭异常完全重新抛出。

答案 3 :(得分:0)

  1. 异常可以在catch中处理。
  2. 在finally块中,有时候应该处理异常。
  3. 这不是一种不好的做法,但是如果你想以一种有意义的方式处理异常,那就赶上预期的异常。示例如下。

    public void test() 
    { 
    
    InputStream stream = null;
    
    try{
        // do something
        // initialize stream
        // again do something     
       }
    
     catch(ExpectedException e)
      {
       //Handle the expected exception add a meaningful message here
       //If needed new exception (custom exception) can be thrown to where this
       // method is called and the new exception should be a meaningful to the called
       }
    
      finally
      {
    
        if (stream != null)
    
          try{
           steam.close();
    
          }catch(Exception e){
           //log the error and throw if needed as explained above. 
          }
        }
    

    }