为什么我的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
编辑:清除问题以删除无关的信息。
答案 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)
Try-Catches通常不是默默地失败。只是为了清楚起来。
代码中的_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。