Jor*_*rdy 7 c# exception .net-4.0
有多种问题(1,2,3,4等等等等)被称为"为什么不是这个异常捕获".可悲的是,这些解决方案都不适合我......所以我遇到了一个真正无法捕获的异常.
我有一段代码(.NET 4.0)检查大文本文件的数字和数字.测试时我遇到了运行时异常:

你在这里看到的是一个带有ArgumentOutOfRangeException的catchblock的try-catch模式.但是在运行时,try块会抛出一个未被捕获的ArgumentOutOfRangeException.
我阅读了关于try-catch结构的C#语言规范部分,它说:
如果可以访问try语句,则可以访问try语句的catch块.
所以理论上上面的代码应该捕获异常.
然后我认为它可能与这个代码在任务中运行这一事实有关(在处理文本文件期间我也想更新UI,所以我做异步).我周围中搜索,然后我找到这个答案由乔恩斯基特.基本上建议我在try-catch块中使用Task.Wait来捕获任何异常.
我现在面临的问题是我无法真正调用Task.Wait,因为这会阻塞作为我的UI线程的调用线程!然后我想我可以创建一个额外的任务层来等待该任务:
//Code called from the UI
System.Threading.Tasks.Task.Factory.StartNew(()=>
{
//Create a new task and use this task to catch any exceptions
System.Threading.Tasks.Task task = System.Threading.Tasks.Task.Factory.StartNew(MethodWithException);
try
{
task.Wait();
}
catch(Exception)
{
MessageBox.Show("Caught it!");
}
});
Run Code Online (Sandbox Code Playgroud)
但是这仍然会产生相同的结果......然后我认为这可能是因为我对Exceptiontype不够具体.但C#语言规范指出:
某些编程语言可能支持不能表示为从System.Exception派生的对象的异常,尽管C#代码永远不会生成此类异常.
因此,除非您使用一些粗略的第三方API,否则在使用时总是很好Exception.所以我发现自己有一个Jon Skeet的建议答案,这对我来说并不适用.就在那时,我知道我应该停止尝试......
那么有谁知道发生了什么?我该如何解决这个问题?我知道我可以检查是否i等于或大于text.Length但是理解发生的事情比工作代码更重要.
这只是调试器的工件.
在Debug菜单中,有一个名为Exceptions... Click it 的选项,并确保在此处取消选中 "Thrown"复选框:

很多时候,你会想要在上下文中看到错误,即使它在a里面try/catch,这就是这个设置的用途.在这种情况下,这正是您应该做的事情,因此您可以看到比较i长度text并查看问题所在.
如果您在没有调试器的情况下运行代码(例如通过双击可执行文件或使用"Start without Debugging"选项),您将"正确地"抛弃错误而不发出任何警报.
| 归档时间: |
|
| 查看次数: |
341 次 |
| 最近记录: |