假设我有一个MyException类,它是Exception的子类.当我的代码中出现错误时,我正在使用此类来包含上下文信息.
我通常用它来包装一个"标准"异常类.例如,如果在输入验证期间发生错误,我会做类似的事情
if (invalidInput())
throw new MyException(new IllegalArgumentException(), arg1, arg2, ...);
Run Code Online (Sandbox Code Playgroud)
但是我的IDE(Intellij IDEA)警告我,在不抛出它的情况下实例化一个未经检查的异常(在这个例子中为IllegalArgumentException)是不好的,但不告诉我原因.
那么在不抛出异常的情况下实例化异常是多么有罪?我要去哪个地狱圈?
你可能最好抛出一个IllegalArgumentException的实例,在这种情况下,这就是它的用途:
if (invalidInput())
new IllegalArgumentException("Invalid argument " + x + ", expected ...");
Run Code Online (Sandbox Code Playgroud)
或者以其他方式扩展,IllegalArgumentException而不是Exception,如果你想用自定义属性来增强它.
public class MyIllegalArgumentException extends IllegalArgumentException {
public MyIllegalArgumentException(Object arg...) { .... }
}
Run Code Online (Sandbox Code Playgroud)
这两种情况都提供了更精简,更有意义的课堂模式.
更新: 给出您关于想要提供带抛出异常的上下文信息的评论 - 您可以通过将自定义异常对象作为标准异常构造函数的Throwable参数提供,即将其翻转为:所以 不要将相关的标准异常包装在您的例外,您应该将您的异常包装在相关的标准异常中.
if (invalidInput())
new IllegalArgumentException("Invalid argument " + x + ", expected ...", new MyContextException(a,b,c));
Run Code Online (Sandbox Code Playgroud)
(其中a,b和c是您要传输的各种上下文位).这样,您(重新)在代码中的所有点处使用有意义且适当的异常,但是在处理/记录异常时,您可以传输可能希望在堆栈中使用的上下文信息.
归档时间: |
|
查看次数: |
1472 次 |
最近记录: |