如果没有捕获到异常,C# 程序中会发生什么。程序是否因运行时错误而“崩溃”?
5 回答
如果没有捕获到异常,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
是的。
是的。
发生了一些“异常”,您的程序不知道如何处理它,因此它必须在该点停止执行并“崩溃”。崩溃后会有代码执行,比如 finally 块,但基本上你的代码派对已经结束了。
最好的办法是记录这些事件,尽可能多地提供有关崩溃时系统/程序状态的信息。记录应用程序块是记录错误的更强大的自动方法之一。
试试看!根据错误,它通常会捕获。现在,至于是否应该捕获所有异常,如果它类似于a[i]
where 它可能抛出错误 ifi
太大,但您知道i
应该保持在界限内(例如,在 for 循环中),您将不会捕获那个例外。
但是,如果您使用来自用户的数据(例如,来自 GUI),您几乎总是会验证它。
自己试试吧!
class Program
{
static void Main(string[] args)
{
int[] arr = new int[1];
arr[5] = 6; //throws an exception; what kind?
}
}
在调试模式下编译并运行它,以便快速回答您的问题。
或者只是写一些程序。你的代码迟早会抛出异常;它发生在我们所有人身上,通常比我们数不清的次数多。在控制台或 WinForms 应用程序中,未处理的异常通常会使程序崩溃;在 ASP.NET 中,它会生成一个错误页面,但不会使整个网站崩溃。您还可以编写自定义代码,指定在出现未处理的异常时要做什么,以便您的应用程序正常失败。