异常处理中多个“ catch”块的用途是什么

时间:2018-12-12 07:09:11

标签: exception exception-handling runtime-error

  1. 为什么即使我们可以编写一个通用类,也需要多个“ catch”块 例外?
  2. 了解所有异常类型及其用于编写好代码的目的重要吗?

    我在Google上搜索了很多,但是在异常处理方面仍然有些困惑。有什么好的例子吗?

一般异常:

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

多次捕获

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

2 个答案:

答案 0 :(得分:1)

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。了解所有异常类型及其用于编写良好代码的目的是否重要?

我个人会考虑一些重要的异常,例如IO,DB等,这些异常会引起严重的麻烦。对于其他人,我会遇到一个普遍的例外。

答案 1 :(得分:1)

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

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

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

这是您的服务代码:

    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