1

为什么我的 try-catch 块在处理时仍然会抛出错误?

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

              Try
    Here >> :   _MemoryStream.Seek(6 * StartOffset, 0)
                _MemoryStream.Read(_Buffer, 0, 6)
              Catch ex As IOException
                // Handle Error
              End Try

编辑:清理问题以删除无关信息。

4

8 回答 8

6

该应用程序在 try-catch 块内的一条线上爆炸。知道为什么会发生这种情况吗?它不应该只是默默地失败吗?

为什么您认为在 try/catch 中不会发生异常?try.catch 块的全部目的是定义您打算如何处理异常情况。如果没有与抛出的异常类型相对应的 catch 块,则异常将传播出去,直到某些代码捕获它或直到它被引发为未处理。

当然,可以将其Catch ex as Exception用作一个块来捕获所有异常然后吞下它们,但这并不是一个好主意。

就目前NullReferenceException而言,您几乎从不想抓住它们并处理它们(几乎从不)。它们通常表明代码中的某处存在错误,其中逻辑null在访问其方法或属性之前未测试引用。事实上,_MemoryStream变量本身很可能是罪魁祸首——如果它为空,那么调用它会引发确切的异常。

于 2010-04-23T19:48:15.703 回答
6

由于try/catch块只捕获一个IOException,它不会捕获一个NullReferenceException

这可能表明程序中存在您发布的代码之外的某种逻辑错误。并且记录在案,除了这种异常,程序不应该默默地失败——它可能是代码中的错误或库的使用方式(尽管它可能应该由库处理),而不是运行时环境的问题。

于 2010-04-23T19:48:28.263 回答
1
  1. Try-Catches 通常不是关于默默地失败。只是为了澄清这一点。

  2. 代码中的那个点是_MemoryStreamnull (或)吗?Nothingtry-catch 实际上不应该用于处理NullReferenceException.
    在这种情况下,它不会捕获NullReferenceException,因为 aNullReferenceException不是IOException.

于 2010-04-23T19:48:59.573 回答
1

发生这种情况是因为您只捕获 System.IOException 类型的异常,而引发的异常是 System.NullReferenceException。要抓住它,你需要这样做:

Try
   _MemoryStream.Seek(6 * StartOffset, 0)
   _MemoryStream.Read(_Buffer, 0, 6)
Catch ex As IOException

Catch ex As NullReferenceException
   ' Exception would be caught and handled here.
End Try
于 2010-04-23T19:49:12.437 回答
1

我不是 vb.net 专家,但空引用异常不是 IOException,所以异常落空,不能在更高级别捕获。如果您将 IOException 捕获为异常,则应该可以解决问题,尽管这不是最佳实践。

于 2010-04-23T19:50:23.077 回答
0

因为引发的异常不是 IOException。您需要捕获所有异常。

于 2010-04-23T19:48:52.810 回答
0

没有什么可以说 catch 正在捕获所有异常;它可能仅限于某一类不包括这一类的例外。即使它正在捕获此类异常,它也可能会重新抛出它。正确完成后(即 throw;),重新抛出将显示异常是在 catch 内最初导致异常的行中抛出的。

于 2010-04-23T19:48:57.723 回答
0

Catch 正在捕获 IOException(仅)。抛出的异常是 NullReferenceException。

于 2010-04-23T19:50:44.297 回答