为什么会在我的try-catch中抛出错误?

时间:2010-04-23 19:44:19

标签: asp.net vb.net exception nullreferenceexception

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

  

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

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

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

8 个答案:

答案 0 :(得分:6)

  

应用程序正在爆炸   try-catch块内部的一行。任何   想法为什么会发生这种情况?   它不应该只是默默地失败吗?

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

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

NullReferenceException而言,你几乎从不想捕捉它们并处理它们(几乎从不)。它们通常表示代码中某处存在错误,其中逻辑在访问null之前没有测试_MemoryStream的引用。实际上,{{1}}变量本身可能是罪魁祸首 - 如果它为null,则调用它就会引发该确切的异常。

答案 1 :(得分:6)

由于try / catch阻止只捕获IOException,因此不会捕获NullReferenceException

这可能表示除了您发布的代码之外的程序中存在某种逻辑错误。对于记录,有了这种异常,程序不应该无声地失败 - 它可能是代码中的错误或库的使用方式(虽然它可能应该已被处理)由库),而不是运行时环境的问题。

答案 2 :(得分:1)

  1. Try-Catches通常不是默默地失败。只是为了清楚起来。

  2. 代码中的_MemoryStream是否为null(或Nothing)? try-catch几乎不应该用于处理NullReferenceException 在这种情况下,它不会捕获NullReferenceException,因为NullReferenceException不是IOException

答案 3 :(得分: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

答案 4 :(得分:1)

我不是vb.net专家,但是空引用异常不是IOException,因此异常会失败并且不能在更高级别捕获。如果您将IOException捕获为Exception,那应该可以解决问题,尽管不是最佳实践。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

没有什么可说的,捕获正在捕捉所有异常;它可能仅限于某种不包含此类异常的异常。即使它正在捕获这类异常,它也可能会重新抛出它。如果正确完成(即throw;),重新抛出将显示异常,因为抛出导致该异常的catch内部的行。

答案 7 :(得分:0)

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