如何在java中捕获catch块中发生的异常

ddarikpa  于 2021-07-03  发布在  Java
关注(0)|答案(7)|浏览(328)

我需要处理java中catch块代码引发的异常

l7wslrjt

l7wslrjt1#

我认为最干净的方法是创建一个方法,该方法捕获在其主体中发生的异常。但是,它可能非常依赖于您正在处理的情况和代码类型。
你要问的一个例子是关闭 Stream 在一个 try - catch - finally 阻止。例如:

package a;

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Main {

    public static void main(String[] args) {
        OutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream("temp.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            //TODO: Log the exception and handle it, 
            //          for example show a message to the user
        } finally {
            //out.close(); //Second level exception is 
                           //  occurring in closing the
                           //  Stream. Move it to a new method:
            closeOutPutStreamResource(out); 
        }
    }

    private static void closeOutPutStreamResource(OutputStream out){
        try {
            out.close();
        } catch (IOException e) {
            // TODO: log the exception and ignore 
            //          if it's not important
            // OR
            // Throw an instance of RuntimeException 
            //      or one of it's subclasses
            //      which doesn't make you to catch it
            //      using a try-catch block (unchecked)
            throw new CloseOutPutStreamException(e);
        }
    }
}

class CloseOutPutStreamException extends RuntimeException{

    public CloseOutPutStreamException() {
        super();
    }

    public CloseOutPutStreamException(String message, Throwable cause,
            boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }

    public CloseOutPutStreamException(String message, Throwable cause) {
        super(message, cause);
    }

    public CloseOutPutStreamException(String message) {
        super(message);
    }

    public CloseOutPutStreamException(Throwable cause) {
        super(cause);
    }
}

这里我演示了在 finally 块,但同样的情况也适用于 catch 阻止。
在我看来,写作方法如 closeOutPutStreamResource 这可能很有用,因为它们打包了一个锅炉板代码来处理非常常见的异常,并且使您的代码更加优雅。
你也可以选择 catch 并登录异常 closeOutPutStreamResource 或者 throw 它将应用到程序的其他层。但是将这个不重要的检查异常 Package 到 RuntimeException 不需要抓。
希望这会有帮助。

yebdmbv4

yebdmbv42#

例如,要“处理”异常:

try 
{
 // try do something
} 
catch (Exception e) 
{
    System.out.println("Caught Exception: " + e.getMessage());
    //Do some more
}

更多信息请参阅:请参阅:https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html
但是,如果您想在try catch中获得另一个catch,可以执行以下操作:

try 
     {
           //Do something
     } 
     catch (IOException e) 
     {
            System.out.println("Caught IOException: " + e.getMessage());

            try
            {
                 // Try something else
            }
            catch ( Exception e1 )
            {
                System.out.println("Caught Another exception: " + e1.getMessage());                     
            }
     }

小心使用嵌套的try/catch,当try-catch变得复杂/庞大时,请考虑将其拆分为自己的方法。例如:

try {
    // do something here
}
catch(IOException e)
{
    System.out.println("Caught IOException: " + e.getMessage());
    foo();
}

private void foo()
{
    try {
        // do something here (when we have the IO exception)
    }
    catch(Exception e)
    {
        System.out.println("Caught another exception: " + e.getMessage());
    }
}
2w2cym1i

2w2cym1i3#

您可以在主catch块中添加新的try catch块。

try
      {
         int b=10/0;
      }catch(ArithmeticException e)
      {
         System.out.println("ArithmeticException occurred");
         try
         {
         int c=20/0;
         }catch(ArithmeticException e1)
         {
            System.out.println("Another ArithmeticException occurred");
         }
      }
o4tp2gmn

o4tp2gmn4#

我建议您调用另一个方法,执行所需的操作,而不是级联try/catch(与大多数其他答案一样)。通过这种方式,您的代码将更易于维护。
在这个方法中,放置一个try/catch块来保护代码。
例子:

public int classicMethodInCaseOfException(int exampleParam) {
    try {
        // TODO
    }
    catch(Exception e)
    {
        methodInCaseOfException();
    }
}

public int methodInCaseOfException()
{
    try {
        // TODO
    }
    catch(Exception e)
    {
        //TODO
    }
}
omjgkv6w

omjgkv6w5#

可以在方法或块中的任何位置使用try-catch块,因此也可以在catch块中编写try-catch。

try {

// master try

}catch(Exception e){
// master catch

try {
// child try in master catch

}catch(Exception e1){
// child catch in master catch

}
}//master catch
nafvub8i

nafvub8i6#

当catch块抛出异常时,没有必要像这里的所有答案所建议的那样使用嵌套的try-catch块。可以用try catch括起调用方方法来处理该异常。

6g8kf2rb

6g8kf2rb7#

在通常的试一试/接球情况下,要做的就是:

try{
    throw new Exception();
}catch(Exception e1){
    try{
        throw new Exception();
    }catch(Exception e2){
    //do something
    }
}

相关问题