我想知道抛出Exception
和抛出NullPointer Exception
之类的特定异常之间有什么区别。
据我所知,Exception
应该能够捕获任何类型的异常,因为使用特定的Exception期望只能抛出该异常类型。
示例:
void test(String testString) throws Exception;
VS
void test(String testString) throws NullPointerException;
如果这对我来说是正确的,那么总是抛出异常并永远不会命名特定的异常是有意义的。我错过了一些重要的东西吗?它至少会影响性能吗?很多人都在寻找抛出和捕捉异常,但没有人问这个非常基本的问题。
除了Exception
之外,我没有看到抛出任何异常的好处。
答案 0 :(得分:4)
至少有两个原因可以让您想要抛出特定类型的异常:
Exception
与FileNotFoundException
进行比较。后者显然为您提供了更多信息。TimeoutException
的方式捕获和处理NullReferenceException
。答案 1 :(得分:3)
首先,Exception
是每个Exception
的基本类型。就像object
就是一切。
通过抛出特定的Exception
,您可以向消费者提供有关已发生事件的更多信息。
想象一下,在没有消息的情况下获得普通Exception
,消费者丢失的情况。例如,当框架抛出NullReferenceException
时,您就会意识到您的某个对象没有它试图访问的引用。
这就是你如何链接异常并使用它们的类型:
try
{
throw new NotImplementedException();
}
catch(NullReferenceException ex)
{
// Logic for NullReference exception if needed.
}
catch(NotImplementedException ex)
{
// This will be executed.
}
catch(Exception ex)
{
// Will catch every exception.
}
答案 2 :(得分:2)
您提到的NullPointerException
是常规Exception
的一个非常好的示例,因为它是RuntimeException
的子类。 <{1}}的(子类)的任何抛出都不必被捕获或声明。
任何其他(=不是RuntimeException
的子类)必须通过try / catch块或RuntimeException
声明在代码中处理异常。否则,你的代码甚至不会编译!这迫使您作为开发人员处理可能弹出的错误。
至于为什么使用不同的Exception类型很有用,请考虑以下使用多个throws
语句的简单示例:
catch
在这个例子中,两个不同的异常以两个不同的catch块结束,这使得您可以以不同的方式处理这些错误。
答案 3 :(得分:0)
抛出特定异常而不是通用异常是最佳做法。这是因为调用者可能希望以不同方式处理异常,例如在WebApi中,您可能希望为ArgumentNullException返回错误请求响应(400),但您可能希望为其他类型的异常返回不同的结果。例如,您可能实际抛出自定义NotFoundException,然后控制器将捕获它并返回Not Found响应(404)。 基本上,如果您抛出特定的异常,则允许使用者代码以他们想要的方式处理不同的异常情况。