65.9K
CodeProject 正在变化。 阅读更多。
Home

在 VC++ 中使用异常处理

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.75/5 (11投票s)

2010 年 4 月 19 日

CPOL

2分钟阅读

viewsIcon

118745

downloadIcon

246

这将有助于理解编写具有良好编程实践的代码的用处。

引言

像每个 Windows 用户一样,您可能不止一次地遭受过这种烦人的情况:您正在使用一个应用程序,然后突然,没有任何合理的解释,应用程序崩溃了,并且系统消息框出现在屏幕上,告诉您应用程序将要终止。 这种崩溃窗口因操作系统而异:例如,在 Windows 98 中,显示以下文本:“此程序执行了非法操作,将被关闭”。 Windows 2000 和 Windows NT 与以前版本的 Windows 相比,显示了导致异常的问题的详细信息。例如:“位于“0x00401000”的指令引用了位于“0x00000000”的内存,无法写入内存。”
然而,所有 Windows 操作系统都有一个共同点:在这种情况下,您将丢失自上次保存操作以来完成的所有工作。

背景

大约一年前,在编写一个大型应用程序(包含大约 93 个内部项目)时,其中大约有 15 个线程不断运行并相互通信,我遇到了几个问题。 很多时候在程序的中间,它崩溃了。

这个问题大多是由于应用程序本身或操作系统的一个组件或库中的错误引起的。 幸运的是,程序员可以通过应用一个简单的异常处理机制来避免这种烦人的崩溃。

Borland Delphi 开发工具是有效崩溃处理的一个很好的例子:此工具创建的可执行文件具有一个特殊的内置异常处理例程,因此,每当 Delphi 程序中发生异常时,Delphi 会显示一个特殊的对话框。此对话框包含有关导致异常的一些信息。 用户单击“确定”后,程序继续正常运行。

Visual C++(以及来自 Microsoft 的其他开发工具)不像 Delphi 那样提供自动异常处理模块,因此,如果您想避免在您的 C/C++ 应用程序中崩溃,则必须显式地将异常处理例程添加到您的软件中。

ExceptionTest (异常测试)

ExceptionTest 示例演示了如何通过使用 __try__except 语句来避免应用程序崩溃。 运行示例时,您会得到一个包含 2 个按钮的对话框。 第一个按钮在没有异常处理块的情况下引发异常,这会导致应用程序立即崩溃。 第二个按钮从 __try 块内引发异常。 当异常发生时,将调用 __except 语句中的函数 (GetExceptionInformation)。 此函数显示一个特殊的对话框,其中包含有关异常的一些信息,并允许用户决定是要继续运行程序还是终止它。 用户还可以将异常信息复制到剪贴板。

void HandledExceptionTest() 
{
 __try
 {
  //This function causes the exception
  DoException();
 }
 //If an exception occurs, display our exception dialog:
 __except(ShowExceptionDlg(GetExceptionInformation())) 
 {
  ExceptionFunction();
 }
}
void UnhandledExceptionTest() {
 //This function causes the exception. 
 //Because there is no exception handling here, the program will crash.
 DoException();
}

历史

  • 2010 年 4 月 19 日:初次发布  
© . All rights reserved.