繁体   English   中英

抛出异常和抛出特定异常(例如NullPointerException)之间的区别

[英]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之外,我没有看到抛出任何异常的好处。

至少有两个原因可以导致您抛出特定类型的异常:

  1. 如果某个程序因异常而失败,您将获得更多信息以确定哪里出错。 ExceptionFileNotFoundException进行比较。 后者显然为您提供了更多信息。
  2. 在某些情况下,代码会想要捕获某些类型的异常。 例如,在使用串行端口时,您可能希望以与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM