有多个问题(1、2、3.、4.等)名为“为什么这个异常没有被捕获”。可悲的是,这些解决方案都不适合我.因此,我被一个真正难以捕捉的例外所困。
我有一段代码(.NET 4.0),它检查一个大型文本文件的数字和数字。在测试过程中,我得到了一个运行时异常:

您在这里看到的是一个尝试捕获模式,它带有一个ArgumentOutOfRangeException的集水区。但是在运行时,try块抛出一个没有被捕获的ArgumentOutOfRangeException。
我阅读了C#语言规范一节中关于试图捕获结构的内容,它说:
如果try语句是可访问的,则try语句的catch块是可访问的。
因此,从理论上讲,上面的代码应该捕获异常。
然后,我想这可能与以下事实有关:这段代码运行在一个任务中(在处理textfile期间,我还想更新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!");
}
});但这个结果还是一样..。然后我想这可能是因为我对我的异常类型不够具体。但是C#语言规范指出:
一些编程语言可能支持无法表示为从System.Exception派生的对象的异常,尽管这种异常永远不会由C#代码生成。
因此,除非您使用一些粗略的第三方API,否则使用Exception总是很好的。所以我发现自己得到了乔恩·斯基特建议的答案,这个答案对我来说不太管用。那时我知道我应该停止尝试..。
有人知道这是怎么回事吗?我怎么才能解决这个问题?我知道我可以检查i是否等于或大于text.Length,但是了解正在发生的事情比工作代码更重要。
发布于 2013-08-05 13:36:16
这只是调试器的一个工件。
在Debug菜单中,有一个名为Exceptions...单击它的选项,并确保在这里取消选中“引发”复选框:

很多时候,您都希望看到上下文中的错误,即使它在try/catch中,这就是这个设置的目的。在这种情况下,这正是您应该做的,这样您就可以将i与text的长度进行比较,并查看您的问题所在。
如果您在没有调试器的情况下运行代码(例如双击可执行文件或使用“开始而不调试”选项),您将“正确地”丢弃错误而不发出任何警报。
发布于 2013-08-05 13:38:58
我刚刚写了以下测试:
[TestMethod]
public void ArgumentOutOfRangeExceptionTest()
{
string test = "abc";
int i = 0;
try
{
while (true)
{
test.ElementAt(i);
i++;
}
}
catch (ArgumentOutOfRangeException)
{ }
}它很好用。我相信您有另一个异常,在您的调用代码中没有调用。
我知道只有一个例外是不能被抓住的。是StackOverflowException。关于这件事,请见这个问题。
https://stackoverflow.com/questions/18059399
复制相似问题