异常处理中多个"catch"块的目的是什么

What is the purpose of multiple "catch" blocks in exception handling

  1. 为什么我们需要多个“catch”块,即使我们可以编写一个泛型 异常?

  2. 了解所有异常类型及其目的对于编写好的代码很重要吗?

    我在谷歌上搜索了很多,但仍然对异常处理感到困惑。有什么好的例子吗?

一般异常:

try{
//some code
}
catch(Exception e){
//print e
}
//that's it.

多次捕获

try{
//some code
}
catch(IOException e){
}
catch(SQLException e){
}

1.为什么我们需要多个 "catch" 块,即使我们可以编写一个通用异常?

有时您可能需要指定导致问题的原因。

例如,

try {
  ...
} catch(IOException e) {
  // Print "Error: we cannot open your file"
} catch(SQLException e) {
  // Print: "Error: we cannot connect to the database"
}

通过不同的错误,用户可以很容易地理解哪里出了问题。

如果我们选择

try {
  ...
} catch(Exception e) {
  // Print "Error: " + e.
}

用户更难找出问题所在。

此外,如果我们使用多个 catch-es,我们可以根据错误将用户发送到不同的页面。


2.Is 了解所有异常类型及其目的对于编写好代码很重要吗?

就我个人而言,我会选择重要的异常,例如 IO、DB 等,它们可能会导致严重的问题。对于其他人,我会抓住一般例外。

使用多个异常有几个优点:

  1. 一般异常不会让您知道问题的确切根本原因,尤其是当许多 steps/checks 涉及方法实现时。另外,如果由于各种原因发生异常,则需要从调用方方法实现中抛出不同类型的异常。

例如:您可以抛出自定义异常。

这是您的服务代码:

    public void Login(string username, string password)
    {
      if(string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
      {
      throw InvalidUserNameException();
      }
      if(!IsInternetAvaialable()) 
      {
      throw NoInternetAvailableException()
      }
      else
      {
      //Implement though your login process and if need use various custom exceptions or throw the exception if occurs.
      }
    }

    public class InvalidUserNameException : Exception
    { 
      public InvalidUserNameException()
      {
      }

      public InvalidUserNameException(string message)
        : base(message)
      {
      }

      public InvalidUserNameException(string message, Exception inner)
        : base(message, inner)
      {
      }
   }

调用方方法:

try {
  ...
} catch(InvalidUserNameException e) {
  // Show Alert Message here
} catch(NoInternetAvaibleException e) {
  // Show Alert Message with specific reason
}
catch(Exception e) {
  // Other Generic Exception goes here
}

参考: https://docs.microsoft.com/en-us/dotnet/standard/exceptions/how-to-create-user-defined-exceptions