2010-04-23 103 views
1

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

异常详细信息: System.NullReferenceException:对象 参考不设置到 对象的实例。

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

编辑:清理的问题,将其取出的无关信息。

回答

6

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

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

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

只要NullReferenceException去,你几乎永远不想抓住他们,并处理他们(几乎从不)。它们通常表示代码中存在一处错误,即在访问其上的方法或属性之前逻辑未测试null的引用。事实上,很可能_MemoryStream变量本身就是罪魁祸首 - 如果它是空的,那么在它上调用一个调用就会引发这个确切的异常。

6

由于try/catch块仅捕获IOException,因此它不会捕获NullReferenceException

这可能表示程序中发布的代码之外的某种逻辑错误。而对于这种例外情况,程序不应该默默地失败 - 这可能是代码中的错误或库的使用方式(虽然它可能应该由库处理),不是运行时环境的问题。

0

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

0

没有什么可以说渔获能捕捉所有的异常;它可能会被限制在一个特定的例外类别中,但不包括这个例外。即使它正在捕捉这类异常,它可能会重新抛出异常。当正确完成(即throw;)时,重新抛出将显示抛出异常的捕获行中的异常。

1
  1. Try-Catches通常不会在默默地失败。只是为了澄清这一点。

  2. _MemoryStream null(或Nothing)在代码中的那一点?尝试抓住几乎从来没有被用来处理NullReferenceException
    在这种情况下它不捕获NullReferenceException,因为NullReferenceException不是IOException

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 
1

我不是vb.net专家,但一个空引用异常不是一个IOException,所以异常落空,不得以更高的被抓水平。如果将IOException作为异常来捕获,那应该可以做到,尽管不是最佳实践。

+0

这不仅不是最好的做法,它实际上总是一个错误。 – 2010-04-23 19:53:19

0

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

+0

哇。在我输入我的答案的时间里有7个其他答案。 :) – 2010-04-23 19:52:15

相关问题