【问题标题】:Exception number needed instead of message string需要异常号而不是消息字符串
【发布时间】:2011-06-20 09:17:45
【问题描述】:

例如,我想知道异常是否是“内存溢出异常”。但是,如果操作系统上的语言不是英语而是中文或德语,则消息会发生变化。而且我再也看不到消息字符串了。在MSDN 上,我没有找到可以使用的异常编号。如何找到异常号?

   Public Shared Sub Main()
      Dim x As Integer = 0
      Try
         Dim y As Integer = 100 / x
      Catch e As Exception'here, 123 is not working
         if e is ArithmeticException(123) then Console.WriteLine("Generic Exception Handler: {0}", e.ToString())
      End Try
   End Sub

示例(查看

   Try
                    m_DxFilGraphManager.Run()
                Catch ex As System.Runtime.InteropServices.COMException
                    If ex.Message.Contains("0x800705AA") Then '<-- Bad methode. How to do it better?
                        Return "#ERROR: Can not start capturing. It seems to be a possiblity to change the IEEE 1394 bus host controler system driver in your device manager to 'legacy / alt'. " & ex.Message
                    Else
                        Return "#ERROR: " & ex.Message
                    End If
      End Try

【问题讨论】:

  • ErrorCode 不是System.Exception 的普通成员。一些特定的异常类型提供了这样的成员(还可以考虑System.Data.SqlClient.SqlException 上的各种信息),但通常您首先按类型捕获,然后(如果需要)使用异常(类型)特定信息查看是否有更多可用信息。跨度>

标签: .net exception error-handling


【解决方案1】:

通常在 .NET 中(尽管除了约定之外没有强制执行),每个原因都有一个从 System.Exception 派生的专用异常类型。因此,例如,您的“内存溢出”很可能由System.OutOfMemoryException 发出信号。查看 the System.Exception class hierarchy on MSDN 以获取有关 .NET 框架中异常类型的更多信息。尽管您的代码和第 3 方组件始终可以定义自己的。

话虽如此,他们肯定是毛茸茸的案例,例如IOException。有时您几乎不会尝试解析错误消息 - 当然这可能是本地化的。大多数情况下,您可以解决这个问题。

作为一项规则,请确保只捕获您真正感兴趣的异常类型。此外,您可能希望限制 try 块中的语句数量以(相当)确保您正在对引发的异常做出反应通过正确的陈述。

最后,太粗粒度的异常处理和太细粒度的异常处理一样糟糕。它始终取决于您的实际代码。

【讨论】:

  • @Christian.K:我添加了一张图片。我不能完全相信您现在会解析消息以捕获图像中的异常。还是我理解错了?
  • @Nasenbaer:不,你不解析消息。您捕获被抛出的特定异常类型。如果您遇到的 API 没有抛出足够具体的异常类型(出于您的目的),您有时不得不求助于其他方式,包括但不限于查看消息文本。但实际上,这应该是例外(没有双关语)。
  • @Christian.K:对不起。我不明白。也许是因为我的英语不好?我现在包含了一些代码。能否请您再试一次,告诉我如何在不使用消息字符串的情况下捕获带有消息内容“Systemressourcen”的指定异常?
  • @Nasenbaer:我很困惑,因为最初你在谈论ArithmeticException,我认为这是非常具体的,但当然是YMMV,但现在它是COMException,相当通用通过它自己。我会问自己你是否真的需要知道具体原因。至少在您的示例中(通常在现实中也是如此)您并不需要知道,因为您的错误处理很可能是相同的。
  • @Nasenbaer:我认为您可以测试COMExceptionErrorCode 属性是否与您的错误代码相等。如果这是一个稳定的值或根本有意义,当然取决于引发异常的外部代码。
【解决方案2】:

使用适当的异常处理:

Public Shared Sub Main()
  Dim x As Integer = 0
  Try
     Dim y As Integer = 100 / x
  Catch e As ArithmeticException
     // handle ArithmeticException
  Catch e As Exception
     // handle Exception
  End Try
End Sub

捕捉Exception 是不好的做法 - 我建议阅读the documentation

您可以使用几种特定的异常类型 - DivideByZeroExceptionNotFiniteNumberException 派生自 ArithmeticException

【讨论】:

  • 我添加了一张图片。 ArithmeticException 不够精确。据我测试, ErrorCode 属性不会返回一致的值,是吗?
  • @Nasenbaer - 据我所知,HResult 是在运行时创建/抛出异常时确定的。在同一台机器上会不一致。
  • 这就是我的意思。但是我需要一个一致的方法而不是本地的方法来解决或处理异常。 ArithmeticException 不是单个异常,而是包含大量可能性。我只想选择一个例外来处理。怎么做?
猜你喜欢
  • 2013-04-19
  • 2013-09-09
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多