C# 白鲸例外

C# 白鲸例外,c#,exception,.net-4.0,C#,Exception,.net 4.0,有多个问题(、、等)称为“为什么没有捕获此异常”。可悲的是,这些解决方案都不适合我。。。因此,我遇到了一个真正无法修补的异常 我有一段代码(.NET 4.0),用于检查大型文本文件中的数字和数字。在测试期间,我遇到了一个运行时异常: 这里您看到的是一个try-catch模式,其中包含ArgumentOutOfRangeException的catchblock。但是在运行时,try块抛出未捕获的ArgumentOutOfRangeException 我读了关于try-catch结构的部分,它说:

有多个问题(、、等)称为“为什么没有捕获此异常”。可悲的是,这些解决方案都不适合我。。。因此,我遇到了一个真正无法修补的异常

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

这里您看到的是一个try-catch模式,其中包含ArgumentOutOfRangeException的catchblock。但是在运行时,try块抛出未捕获的ArgumentOutOfRangeException

我读了关于try-catch结构的部分,它说:

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

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

然后我认为这可能与以下事实有关:该代码正在任务中运行(在处理文本文件的过程中,我还希望更新UI,以便异步执行)。我四处寻找,然后找到了乔恩·斯基特的答案。基本上建议我使用Task。在try-catch块中等待以捕获任何异常

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

//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!");
    }
});
但这仍然给出了相同的结果。。。然后我想这可能是因为我对我的Exceptiontype不够具体。但C语言规范规定:

一些编程语言可能支持不能表示为从System.Exception派生的对象的异常,尽管这些异常永远不能由C#代码生成

因此,除非您使用一些粗略的第三方API,否则当您使用
Exception
时,您总是很好的。因此,我发现自己得到了Jon Skeet提出的一个建议答案,但这个答案对我来说并不太合适。那时我知道我应该停止尝试


有人知道发生了什么吗?我怎样才能解决这个问题?我知道我可以检查
I
是否等于或大于
text.Length
,但了解发生了什么比使用代码更重要。

这只是调试器的一个工件

Debug
菜单中,有一个名为
Exceptions…
的选项,单击它,并确保取消选中此处的“抛出”复选框:

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


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

我刚刚编写了以下测试:

    [TestMethod]
    public void ArgumentOutOfRangeExceptionTest()
    {
        string test = "abc";
        int i = 0;
        try
        {
            while (true)
            {
                test.ElementAt(i);
                i++;
            }
        }
        catch (ArgumentOutOfRangeException)
        { }
    }

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


我知道只有一个例外是抓不到的。这是
堆栈溢出例外
。看看吧。

如果没有空的
catch
主体,它是否也未损坏?您是否100%确定该异常未处理?有没有可能只是在Visual Studio中设置了中断任何异常的选项?您是否尝试在VS IDE之外运行程序?+1用于此问题,但也是因为问题标题:)您是否尝试在中断此异常后继续执行?为什么我的VS没有列出用户处理的列?是因为我用的是速成版吗?真管用!非常感谢。但是为什么他不对每个抛出的异常都这样做呢?我想知道这个复选框是如何被选中的,因为它在我的其他项目中不是默认的…@nawfal-See@Jordy-不知道。“我以前曾让它神秘地检查或取消检查,但一直无法找出原因。@nawfal,通常我会等半个小时,以防止在别人可能更好的时候给出一个被接受的答案。”。但鉴于这一点行之有效,而且如此简单,我可以忽略它一次;)我认为无法捕捉到
ExecutingEngineException
。截图清楚地描述了发生ArgumentOutOfRangeException。为什么你会认为这是一个StackOverflowException呢?你链接的问题没有提到这一点。“我相信你有另一个例外”,它与printscreen所说的有什么不同?或者你到底是什么意思?我认为你在屏幕上看到的异常是在下面的catch块中捕获的。我假设您的应用程序出现了一些问题,这就是为什么要调试它。但是这个问题并不是因为屏幕截图上的异常。嘿,捕获异常并不意味着它不再被抛出。您仍然可以看到异常被抛出,但稍后会被捕获。