C#应用程序中的未处理异常会导致应用程序崩溃吗?

3
在我的C#应用程序中,当我在Visual Studio的调试模式下运行它时,它会中断并显示未处理的异常(这是System.ArgumentException)。但是当我在发布模式下运行它时,应用程序不会崩溃。
我的问题是,如果我有未处理的异常,会有什么后果?当用户遇到这种情况时,应用程序是否会崩溃?

8
当然它崩溃了。 - Amit Kumar Ghosh
什么是崩溃?它是控制台应用程序吗?如果是,尝试在 IDE 外部运行它。 - shahkalpesh
你为什么不试一下呢?我只需要花10分钟写一个概念验证。 - Aron
2
你确定它是说它未被处理,还是 Visual Studio 在异常被抛出时中断执行,即使它随后被处理了? - James Thorpe
“在调试器中断点”并不等同于“崩溃”。调试器会在您告诉它何时中断。这并不意味着异常未被处理。然而,未处理的异常会发生什么取决于应用程序类型。通常,应用程序将崩溃。 - Panagiotis Kanavos
1
考虑添加相关的代码或准备 MCVE。 - Sinatr
2个回答

1

C#应用程序中的未处理异常会导致应用程序崩溃吗?

如果你的意思是“我没有处理”,那么不一定会导致应用程序崩溃。假设你的方法从静态void Main(在主线程中)开始,并抛出未处理的异常,这将导致应用程序崩溃。但是,另一方面,如果你在新的Task(Method)中异步运行相同的方法,则它将崩溃执行此Task的线程,但不会崩溃整个应用程序(任务管理器会自动处理此异常)。

P.S. 因此,任何未处理的异常都会终止程序流程。


1
ThrowUnobservedTaskExceptions śÄéšĻąś†∑Ôľü - Sinatr
2
如果异常没有崩溃/终止进程,那么它已经被处理了。也许不是由您的代码处理,而是由框架中的异常处理程序处理。这也适用于任务,您可以配置是否应该处理“未观察到的任务异常”。 - Martin Liversage

0
如果异常确实未被处理(它会冒泡到所有层),那么它将导致应用程序崩溃。但是,正如其他人在之前提到的,当异常仅在某行代码上抛出并在任何其他合适的点上捕获时,VS可能会显示错误,并在您的catch处理程序中继续调试。
考虑以下代码:
void Main(string[] args) 
{
    try {
        DoSomething();
    } catch {
        /* error-handling happens here */
    }
}

void DoSomething {
    // this exception will bubble until Main and is handled there --> no crash
    throw new ArgumentException();
}

然而,如果您的Main方法(或DoSomething方法)中没有任何try-catch块,应用程序也会冒泡传递,但由于未处理,它将导致应用程序崩溃。

关于“可能会显示错误”的问题,我更喜欢在应用程序运行时附加调试器并自己检测,而不是在这种情况下处理未处理的异常,这样它们就保证会崩溃,并且更容易进行调试。 - Sinatr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接