我想抛出异常返回调用一个。所以我抓住了异常并投掷它。同时抛出它要求我围绕try catch块中的语句。在catch块中抛出异常请求另一个try catch块
catch(IOException e){
throw new Exception(e);//ask me to surround with try catch
}
只是想知道为什么这样说。
我想抛出异常返回调用一个。所以我抓住了异常并投掷它。同时抛出它要求我围绕try catch块中的语句。在catch块中抛出异常请求另一个try catch块
catch(IOException e){
throw new Exception(e);//ask me to surround with try catch
}
只是想知道为什么这样说。
是的,你正在捕捉IOException
而你想抛出一个Exception
。你必须添加throws Exception
方法。
public void myMethod() throws Exception{
try{
// implementaion
}catch(IOException e){
throw new Exception(e);
}
}
您的方法签名可能没有定义为抛出异常。将throws Exception
添加到您的方法,它应该工作。
否则
您只能扔的Exception
一个子类,但没有父母Exception
这是不能接受的。因此你需要捕捉它或明确地抛出。
这是因为Exception
是checked。你需要重新抛出RuntimeException
的子类。通常IllegalArgumentException
或IllegalStateException
使用
public void myMethod(){
try{
// implementaion
}catch(IOException e){
LOG.error(e);
throw new IllegalArgumentException("Bad file: ", e);
}
}
您需要声明由您的方法抛出的期望exeption类型。请注意,抛出一个简单的Exception
类实例是一个非常糟糕的主意。
public void myMethod() throws Exception {
try {
// Do something that may cause an IOException
} catch(IOException e){
throw new Exception(e);
}
}
当你扔的Exception
(一个不属于任何子类的实例)的实例,你真的不能做专门的异常处理。方法签名中的throws Exception
声明很可能会像疾病一样在您的类层次结构中级联。考虑抛出一个更具体(可能是自定义)的实例Exception
。
在某些情况下,可能无法处理由它最初抛出的标准Java类引发的异常,但使用下面的代码,而把它返回给调用者可行:
public void myMethod() throws IOException {
// Do something that may cause an IOException
}
由于其他人指出,你的方法签名需要说明它会抛出什么样的异常类型。
但更重要的是,如果您未创建新的特定类型的异常,则不需要新的另一个异常。只要重新抛出一个你抓到的那个throw e;
。
或者如果你不打算对它做任何事情,不要打扰它,让它冒泡。
本例中捕捉异常的用法是什么? IOException是Exception的一个子类。为什么不去除catch块? – Mikhail
@Mikhail有时您可能希望向封闭实例添加自定义异常消息。 – Kallja