首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“白鲸例外”

“白鲸例外”
EN

Stack Overflow用户
提问于 2013-08-05 13:29:24
回答 2查看 391关注 0票数 9

有多个问题(123.4.等)名为“为什么这个异常没有被捕获”。可悲的是,这些解决方案都不适合我.因此,我被一个真正难以捕捉的例外所困。

我有一段代码(.NET 4.0),它检查一个大型文本文件的数字和数字。在测试过程中,我得到了一个运行时异常:

您在这里看到的是一个尝试捕获模式,它带有一个ArgumentOutOfRangeException的集水区。但是在运行时,try块抛出一个没有被捕获的ArgumentOutOfRangeException。

我阅读了C#语言规范一节中关于试图捕获结构的内容,它说:

如果try语句是可访问的,则try语句的catch块是可访问的。

因此,从理论上讲,上面的代码应该捕获异常。

然后,我想这可能与以下事实有关:这段代码运行在一个任务中(在处理textfile期间,我还想更新UI,所以我是异步的)。我四处搜寻,然后我找到了乔恩·斯基特的答案。基本上,这意味着我在一个try-catch块中使用Task.Wait来捕获任何异常。

我现在面临的问题是,我不能真正调用Task.Wait,因为这会阻止调用线程,这是我的UI线程!然后,我想我可以创建一个额外的任务层来等待这个任务:

代码语言:javascript
复制
//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,但是了解正在发生的事情比工作代码更重要。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-05 13:36:16

这只是调试器的一个工件。

Debug菜单中,有一个名为Exceptions...单击它的选项,并确保在这里取消选中“引发”复选框:

很多时候,您都希望看到上下文中的错误,即使它在try/catch中,这就是这个设置的目的。在这种情况下,这正是您应该做的,这样您就可以将itext的长度进行比较,并查看您的问题所在。

如果您在没有调试器的情况下运行代码(例如双击可执行文件或使用“开始而不调试”选项),您将“正确地”丢弃错误而不发出任何警报。

票数 7
EN

Stack Overflow用户

发布于 2013-08-05 13:38:58

我刚刚写了以下测试:

代码语言:javascript
复制
    [TestMethod]
    public void ArgumentOutOfRangeExceptionTest()
    {
        string test = "abc";
        int i = 0;
        try
        {
            while (true)
            {
                test.ElementAt(i);
                i++;
            }
        }
        catch (ArgumentOutOfRangeException)
        { }
    }

它很好用。我相信您有另一个异常,在您的调用代码中没有调用。

我知道只有一个例外是不能被抓住的。是StackOverflowException。关于这件事,请见这个问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18059399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档