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)
语言是否自然地支持这种情况?
如果没有,以下是一个好的做法?(我想不出有什么不妥.但它让我担心,因为我不记得看到任何人使用return过catch.)
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)
编辑:评论摘要:
从两种方法中抛出不同的异常.
e.printStackTrace()将打印行号和功能
你想要的是 String methodName = e.getStackTrace()[0].getMethodName());
但这不是一个好习惯。标准方法是在您的日志记录框架中使用适当的方法记录异常,或者(如果编写控制台应用程序,对于Java很少见)将其打印到错误或标准输出或可选地输出到其他记录 PrintStream,例如使用printStackTrace(printStream)。
但是在大多数情况下,您希望将异常传播到上层并通过适当的高级代码处理(或决定不处理)。捕获此类异常会导致令人讨厌的错误。在99%的情况下,从捕获黑色返回也是一个非常糟糕的主意,因为异常表示方法异常终止,而返回值则没有。
这将起作用:
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但是,如果您需要没有完整堆栈跟踪的值,则上述代码非常有用。