gpt4 book ai didi

java - 在不抛出异常的情况下实例化异常是否可以?

转载 作者:搜寻专家 更新时间:2023-10-31 08:16:15 24 4
gpt4 key购买 nike

假设我有一个 MyException 类,它是 Exception 的子类。当我的代码中出现错误时,我使用此类来包含上下文信息。

我通常用它来包装“标准”异常类之一。例如,如果在输入验证期间发生错误,我会做类似的事情

if (invalidInput())
throw new MyException(new IllegalArgumentException(), arg1, arg2, ...);

但是我的 IDE (Intellij IDEA) 警告我实例化一个未经检查的异常(本例中为 IllegalArgumentException)而不抛出它是错误的,但没有告诉我原因。

那么实例化一个异常而不抛出它是多么罪恶呢?我会去 hell 的哪个圈子?

最佳答案

你最好抛出一个 IllegalArgumentException 的实例,在这种情况下,这就是它的用途:

if (invalidInput())
new IllegalArgumentException("Invalid argument " + x + ", expected ...");

或者以其他方式扩展 IllegalArgumentException 而不是 Exception,如果您想使用自定义属性增强它的话。

public class MyIllegalArgumentException extends IllegalArgumentException {  
public MyIllegalArgumentException(Object arg...) { .... }
}

这两种情况都提供了更精简、更有意义的类模型。

更新:考虑到你想为抛出的异常提供上下文信息的评论 - 你可以通过将自定义异常对象作为标准异常构造函数的 Throwable 参数提供来做到这一点,即翻转它:而不是将相关的标准异常包装在您的异常,您应该将异常包装在相关的标准异常中

if (invalidInput())
new IllegalArgumentException("Invalid argument " + x + ", expected ...", new MyContextException(a,b,c));

(其中 a、b 和 c 是您要传输的各种上下文)。通过这种方式,您可以在代码中的所有点(重新)使用一个有意义且适当的异常,但是您可以在处理/记录异常时传输您可能希望在堆栈中进一步使用的上下文信息。

关于java - 在不抛出异常的情况下实例化异常是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1832203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com