【问题标题】:Find out specific Exception找出具体的异常
【发布时间】:2017-06-08 19:13:13
【问题描述】:

抱歉信息不足...

有没有办法找出导致调用抛出异常的特定异常是什么?

目前,我通过执行 catch(Exception e) 来捕获所有异常,但我知道这根本不是好的做法。

有没有办法从异常中知道导致问题的具体原因是什么,以便我可以更细化?

【问题讨论】:

  • e.GetType() 告诉你确切的类型?
  • 除了在运行时使用 GetType() 进行检查外,您还可以捕获 try 中的代码将抛出的特定类型的异常。您应该能够通过智能感知确定代码抛出的异常类型。自从我使用 java 以来已经有一段时间了,但我很确定你必须在函数上使用 'throws' 关键字来指示将被抛出的异常类型,并且大概你的 IDE 有一个自动完成功能这将为每种异常类型填写一个捕获案例。

标签: c# .net exception-handling


【解决方案1】:

您可以使用不同的方法获取有关特定异常的更多信息。在这里,我使用 System.Diagnostics.Debug 类在 Visual Studio 的输出控制台中打印。在你的 catch 块中:

using System.Diagnostics;

try  
{
    // do stuff
}
catch (Exception e)
{
    Debug.WriteLine(e.GetType());  // Displays the type of exception
    Debug.WriteLine(e.Message());  // Displays the exception message
}

你可以在这里看到更多:Exception methods & Exception properties

【讨论】:

    【解决方案2】:

    选项 1 - 文档

    阅读您正在调用的方法的文档,如果它是一个框架类类型(如SqlConnection.Open),则抛出的异常很好记录在案。

    选项 2 - 在运行时发现它们

    如果它的第 3 方库和文档受到限制,则在运行时使用 exception.GetType() 检查 Exception,然后添加要处理的已知异常作为 catch 块。

    就我个人而言,我更喜欢不添加 catch 块,因为我不确定异常是否会实现。如果/当它这样做时,调试器将中断(如果它设置为中断),或者您有一个全局捕获所有日志并重新抛出。然后你得到类型并相应地更新你的代码。添加此类全局异常记录器的位置取决于您正在开发的应用程序的类型。如果您走全局记录器的路线,请注意您 1) 重新抛出异常,以便应用程序在运行时中断并且 吞下它,2) 使用 throw; 语法重新抛出(不是 throw ex; )。

    【讨论】:

      【解决方案3】:

      您可以捕获不同类型的异常。使用此解决方案,您可以轻松处理不同的类型。

      try
      {
          //Try something
      }
      catch (StackOverflowException soe)
      {
          //Handle StackOverFlowException
      }
      catch (FormatException fe)
      {
          //Handle FormatException
      }
      //... Other exceptions
      

      【讨论】:

        【解决方案4】:

        如果您想让它更具体地记录错误,请尝试以下操作:

        e.GetType()
        

        或者,如果您需要更多信息,例如 StackTrace 或消息:

        e.ToString()
        

        如果您只想捕获特定类型的异常,则需要执行以下操作:

        try {
           // someCode
        } catch (SpecificExceptionType e) {
           // someCode (e.g. Console.WriteLine(e.ToString()); )
        }
        catch (AnotherSpecificExceptionType e) {
           // someCode (e.g. Console.WriteLine(e.ToString()); )
        }
        

        【讨论】:

        • 对不起,我有点困惑 - 我认为问题是如何确定不同类型的异常。我指出了提供此功能的 2 种方法(并在我上次编辑中添加了 e.GetType() )。我到底错过了什么?不想听起来粗鲁,我只是想知道将来如何做得更好;)
        • 我也相信异常过滤回答了这个问题
        猜你喜欢
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 1970-01-01
        • 2018-08-03
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多