我有一个简单的编码方案,如:
class A
{
public static void main(String[] args)
{
try{
//some exception
}
catch(Exception e)
{
//Again some exception
}
finally
{
System.out.println("Finally executed");
}
}
}
我的问题:
答案 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)
这不是一种不好的做法,但是如果你想以一种有意义的方式处理异常,那就赶上预期的异常。示例如下。
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.
}
}
}