如何处理应该有很多例外的情况?
how to handle cases that should have many exceptions?
我不得不使用反射来实例化一组 classes。一切都很好,但是反射使用了很多异常,我的方法看起来很难看。
在这些情况下,好的做法有什么建议?
应该抛出这些异常并在高级别捕获它们 class 以便能够提供有关错误的明确信息,但如果我在所有方法中经历 6 或 8 个异常并且 classes 涉及,代码将是可怕的,混乱的,非常可怕的。
private Filter getFilterInstance(String path){
try {
return (Filter) Class.forName(path).getConstructor().newInstance();
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
最好的办法是分开处理。
原因
..
catch(Exception1 | Exception2 ex)
检查发生的异常然后编写处理方法将成为一种开销。
Why do you want to add unnecessary if statements to check which exception occured?
简单地说,您的代码变得不可读。
许多人声称已检查异常和未检查异常之间的 war 已经结束。
未勾选赢了!
所以简单的答案是:在最低级别用简单的异常捕获围绕您的代码,将该异常放入(可能是专门的)RuntimeException 并重新抛出它。
然后,在需要它的更高层上,捕获包装异常,访问其原因并适当地处理它。其中:很可能,您在这里看到的几乎所有不同的已检查异常都类似于内部错误。所以一开始 "different error message" 并不多。
如果每种异常类型需要不同的处理逻辑,请使用单独的 catch 块。
如果它们中的几个需要相同的处理逻辑,请将它们放在同一个块中。
如果所有可能的异常都需要相同的处理逻辑,则捕获基本异常类型。这看起来像是您代码的正确解决方案,因为无论它们是哪种类型,您都将它们传递到记录器中。
private Filter getFilterInstance(String path){
try {
return (Filter) Class.forName(path).getConstructor().newInstance();
} catch (Exception ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
你能赶上ReflectiveOperationException
它是以下的超类型:
- ClassNotFoundException
- 非法访问异常
- 实例化异常
- InvocationTargetException
- NoSuchFieldException
- NoSuchMethodException
这意味着您只需要:
} catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
由于 SecurityException
和 IllegalArgumentException
实际上是运行时异常,您可以:
} catch (ReflectiveOperationException ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
如果您同意 RuntimeException
向呼叫者传播。
我不得不使用反射来实例化一组 classes。一切都很好,但是反射使用了很多异常,我的方法看起来很难看。
在这些情况下,好的做法有什么建议?
应该抛出这些异常并在高级别捕获它们 class 以便能够提供有关错误的明确信息,但如果我在所有方法中经历 6 或 8 个异常并且 classes 涉及,代码将是可怕的,混乱的,非常可怕的。
private Filter getFilterInstance(String path){
try {
return (Filter) Class.forName(path).getConstructor().newInstance();
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
最好的办法是分开处理。
原因
..
catch(Exception1 | Exception2 ex)
检查发生的异常然后编写处理方法将成为一种开销。
Why do you want to add unnecessary if statements to check which exception occured?
简单地说,您的代码变得不可读。
许多人声称已检查异常和未检查异常之间的 war 已经结束。
未勾选赢了!
所以简单的答案是:在最低级别用简单的异常捕获围绕您的代码,将该异常放入(可能是专门的)RuntimeException 并重新抛出它。
然后,在需要它的更高层上,捕获包装异常,访问其原因并适当地处理它。其中:很可能,您在这里看到的几乎所有不同的已检查异常都类似于内部错误。所以一开始 "different error message" 并不多。
如果每种异常类型需要不同的处理逻辑,请使用单独的 catch 块。
如果它们中的几个需要相同的处理逻辑,请将它们放在同一个块中。
如果所有可能的异常都需要相同的处理逻辑,则捕获基本异常类型。这看起来像是您代码的正确解决方案,因为无论它们是哪种类型,您都将它们传递到记录器中。
private Filter getFilterInstance(String path){
try {
return (Filter) Class.forName(path).getConstructor().newInstance();
} catch (Exception ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
你能赶上ReflectiveOperationException
它是以下的超类型:
- ClassNotFoundException
- 非法访问异常
- 实例化异常
- InvocationTargetException
- NoSuchFieldException
- NoSuchMethodException
这意味着您只需要:
} catch (ReflectiveOperationException | SecurityException | IllegalArgumentException ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
由于 SecurityException
和 IllegalArgumentException
实际上是运行时异常,您可以:
} catch (ReflectiveOperationException ex) {
Logger.getLogger(FiltersBuilder.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
如果您同意 RuntimeException
向呼叫者传播。