当我有这样的方法时:
public static void foo(String param) throws IOException
{
try
{
// some IOoperations
if (param.isEmpty())
{
throw new IOException("param is empty");
}
// some other IOoperations
} catch (Exception e) {
/* handle some possible errors of of the IOoperations */
}
}
当抛出IOException(“param为空”)时,它会被该主体中的try-catch
捕获。但是此异常适用于此方法的调用者。我该怎么做呢?是否有“pure-Java”这样做或者我是否必须创建另一种类型的Exception,它不是IOException的实例以避免try-catch体将处理它?</ p>
我知道您建议在这种情况下使用IllegalArgumentException
。但这是我情况的简化示例。事实上,异常 I 抛出是一个IOException。
由于
答案 0 :(得分:7)
制作自己的IOException
自定义子类可能是一个好主意。不仅要解决这个问题,而且有时候对于API用户来说,它有点'用户友好'。
然后你可以在catch块中忽略它(立即重新抛出它)
} catch (FooIOException e) {
throw e;
} catch (Exception e) {
/* handle some possible errors of of the IOoperations */
}
答案 1 :(得分:3)
我觉得我对你的例子的细节感到困惑 - 你为什么要做广泛的
} catch (Exception e) {
如果那个过于通用的捕获条款不存在,你的问题就会消失。
我误解了吗?
答案 2 :(得分:2)
您可以检查您的异常是否是IOException
的实例,如果是,请重新抛出它。
catch( Exception e ) {
if( e instanceof IOException ) {
throw (IOException)e;
}
}
答案 3 :(得分:2)
你可以抓住它并重新抛出它,但正确的解决方案应该是更好地选择你在catch语句中捕获的内容....
例如。在下面的代码中,我捕获了一个FileNotFoundException,因此IOException被抛回到调用方法。
public static void foo(String param) throws IOException {
try {
// some IOoperations
if (param.isEmpty())
{
throw new IOException("param is empty");
}
// some other IOoperations
} catch (FileNotFoundException e) {
/* handle some possible errors of of the IOoperations */
}
}
答案 4 :(得分:0)
我会创建IOException
的子类。这将允许您使用instanceof
检查并重新抛出。
我使用catch (Exception)
的情况非常少。捕获特定异常几乎总是更好。唯一的原因是你想要聚合异常和重新抛出(反射操作是一个常见的地方)。
答案 5 :(得分:0)
如果IOExceptions适用于foo()
调用方,则可以执行以下操作:
public static void foo(String param) throws IOException
{
try
{
// some IOoperations
if (param.isEmpty())
{
throw new IOException("param is empty");
}
// some other IOoperations
} catch (IOException e) {
throw e;
} catch (Exception e) {
/* handle some possible errors of of the IOoperations */
}
}
如果您的异常是唯一真正需要重新抛出的异常,那么创建一个新的IOException子类型名为MyException
,尝试捕获MyException
以重新抛出它。
任何口袋妖怪异常处理都非常难看!