在Java catch块中,您如何知道哪个方法/行抛出异常?

Wei*_*eng 5 java exception try-catch

在try块中,我想执行两个函数.如果第一个失败则不执行第二个.我还想打印出哪个功能失败了.

请参阅以下代码.

try {
  a = func1();
  b = func2();  //won't execute if a failed
}
catch (Exception e) {
  //TODO: print a or b failed?
}
Run Code Online (Sandbox Code Playgroud)

语言是否自然地支持这种情况?

如果没有,以下是一个好的做法?(我想不出有什么不妥.但它让我担心,因为我不记得看到任何人使用returncatch.)

try {
  a = func1();
}
catch {
  //print: a failed
  return; //if a failed then skip the execution of b
}

try {
  b = func2();
}
catch {
  //print: b failed
}
Run Code Online (Sandbox Code Playgroud)

编辑:评论摘要:

  1. 从两种方法中抛出不同的异常.

    • 在这种情况下,方法是由其他人编写的,我无法控制.
  2. e.printStackTrace()将打印行号和功能

    • 我想做的不仅仅是打印.更像是,如果失败,请执行以下代码.

dev*_*ull 5

你想要的是 String methodName = e.getStackTrace()[0].getMethodName());

但这不是一个好习惯。标准方法是在您的日志记录框架中使用适当的方法记录异常,或者(如果编写控制台应用程序,对于Java很少见)将其打印到错误或标准输出或可选地输出到其他记录 PrintStream,例如使用printStackTrace(printStream)

但是在大多数情况下,您希望将异常传播到上层并通过适当的高级代码处理(或决定不处理)。捕获此类异常会导致令人讨厌的错误。在99%的情况下,从捕获黑色返回也是一个非常糟糕的主意,因为异常表示方法异常终止,而返回值则没有。


And*_*eas 1

这将起作用:

String failedFunc = "func1";
try {
    a = func1();
    failedFunc = "func2";
    b = func2();  //won't execute if func1() failed
} catch (Exception e) {
    System.out.println("Func '" + failedFunc + "' failed: " + e);
}
Run Code Online (Sandbox Code Playgroud)

或者当然,如果您所做的只是打印错误,那么打印堆栈跟踪将准确显示失败的位置。failedFunc但是,如果您需要没有完整堆栈跟踪的值,则上述代码非常有用。