
[英]Java - Difference between throwing an Exception and catching and rethrowing Exception
[英]Difference between throwing Exception and throwing a specific Exception such as NullPointerException
我想知道抛出Exception
和抛出一个特定的异常(例如NullPointer Exception
之间有什么区别。
根据我目前的知识, Exception
应该能够捕获任何类型的异常,因为使用特定的Exception期望只能抛出该异常类型。
例:
void test(String testString) throws Exception;
VS
void test(String testString) throws NullPointerException;
如果这对我来说是正确的,那么总是抛出异常并永远不会命名特定的异常是有意义的。 我错过了一些重要的东西吗? 它至少会影响性能吗? 很多人都在寻找抛出和捕捉异常之间的事情,但没有人问这个非常基本的问题。
除了Exception
之外,我没有看到抛出任何异常的好处。
至少有两个原因可以导致您抛出特定类型的异常:
Exception
与FileNotFoundException
进行比较。 后者显然为您提供了更多信息。 NullReferenceException
不同的方式捕获和处理TimeoutException
。 首先, 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.
}
您提到的NullPointerException
是常规Exception
一个非常好的示例,因为它是RuntimeException
的子类。 不必捕获或声明任何抛出(的子类) RuntimeException
。
任何其他(=不是RuntimeException
的子类)必须通过try / catch块或throws
声明在代码中处理异常。 否则,你的代码甚至不会编译! 这迫使您作为开发人员处理可能弹出的错误。
至于为什么使用不同的Exception类型很有用,请考虑以下使用多个catch
语句的简单示例:
void doDBStuff(){
try {
performStatement(someStatement);
} catch(SQLException e){
//invalid SQL syntax, something is broken
} catch(AuthenticationException e){
//invalid user credentials for the db, inform the user to change these values
}
在此示例中,两个不同的异常以两个不同的catch块结束,这使您可以以不同方式处理这些错误。
抛出特定异常而不是通用异常是最佳实践。 这是因为调用者可能希望以不同方式处理异常,例如在WebApi中,您可能希望为ArgumentNullException返回错误请求响应(400),但您可能希望为其他类型的异常返回不同的结果。 例如,您可能实际抛出自定义NotFoundException,然后控制器将捕获它并返回Not Found响应(404)。 基本上,如果抛出特定的异常,则允许使用者代码以他们想要的方式处理不同的异常情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.