1

如果没有捕获到异常,C# 程序中会发生什么。程序是否因运行时错误而“崩溃”?

4

5 回答 5

10

如果没有捕获到异常,C# 程序中会发生什么。程序是否因运行时错误而“崩溃”?

也许。

也许不吧。

发生的是实现定义的

例如,您可能会看到一个对话框,上面写着“有一个未处理的异常,我看到您已经安装了 Visual Studio。您想启动调试器并检查程序状态吗?”

你可能会看到一个对话框,上面写着“有一个未处理的异常,你想向 Microsoft 报告这个吗?”

如果您已经在调试器中运行,调试器可能会做一些事情来引起您的注意。

运行时可以做它想做的任何事情,包括询问你要做什么。

请注意,运行时在 finally 块运行之前知道是否会有 catch 块。您可以使用控制台应用程序轻松演示这一点。编写一个崩溃的应用程序,并在 finally 块中输出:

Unhandled Exception: System.Exception: Exception of type 
'System.Exception' was thrown at 
ConsoleApplication1.Program.Main(String[] args) 
finally running now

走着瞧吧?运行时报告错误,让调试器有机会运行,或者在运行 finally 块之前将问题报告给 Microsoft 或其他任何机构。如果他们真的跑了。他们可能不会。 任何事情都有可能发生。用户可以决定销毁进程,或启动调试器并修复异常,或其他任何方式。

如果您真的想了解异常在 C# 中是如何工作的,您应该阅读以下内容:

http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

于 2011-03-22T03:37:55.883 回答
8

是的。

于 2011-03-22T02:09:59.877 回答
1

是的。

发生了一些“异常”,您的程序不知道如何处理它,因此它必须在该点停止执行并“崩溃”。崩溃后会有代码执行,比如 finally 块,但基本上你的代码派对已经结束了。

最好的办法是记录这些事件,尽可能多地提供有关崩溃时系统/程序状态的信息。记录应用程序块是记录错误的更强大的自动方法之一。

于 2011-03-22T02:15:41.843 回答
0

试试看!根据错误,它通常会捕获。现在,至于是否应该捕获所有异常,如果它类似于a[i]where 它可能抛出错误 ifi太大,但您知道i应该保持在界限内(例如,在 for 循环中),您将不会捕获那个例外。

但是,如果您使用来自用户的数据(例如,来自 GUI),您几乎总是会验证它。

于 2011-03-22T02:11:52.570 回答
0

自己试试吧!

class Program
{
    static void Main(string[] args)
    {
        int[] arr = new int[1];
        arr[5] = 6;   //throws an exception; what kind?
    }
}

在调试模式下编译并运行它,以便快速回答您的问题。

或者只是写一些程序。你的代码迟早会抛出异常;它发生在我们所有人身上,通常比我们数不清的次数多。在控制台或 WinForms 应用程序中,未处理的异常通常会使程序崩溃;在 ASP.NET 中,它会生成一个错误页面,但不会使整个网站崩溃。您还可以编写自定义代码,指定在出现未处理的异常时要做什么,以便您的应用程序正常失败。

于 2011-03-22T02:27:04.687 回答