Exception 在C+中处理访问冲突异常+;建设者

Exception 在C+中处理访问冲突异常+;建设者,exception,exception-handling,c++builder,access-violation,Exception,Exception Handling,C++builder,Access Violation,我正在努力做到: try{ int * i = NULL; *i = 3; }catch(Exception &Err){ ShowMessage(Err.Message); } 我认为这应该捕获访问冲突异常,并通过显示错误消息来处理它 但出于某种原因,我变得很简单 访问冲突 信息而不是完整的信息 模块YYY中的访问冲突XXX。在ZZZ地址写信 顺便说一句,ExceptObject()例程由于某种奇怪的原因返回NULL 我在这里遗漏了什么?请参阅上的MSDN博客

我正在努力做到:

try{
    int * i = NULL;
    *i = 3;
}catch(Exception &Err){
    ShowMessage(Err.Message);
}
我认为这应该捕获访问冲突异常,并通过显示错误消息来处理它

但出于某种原因,我变得很简单

访问冲突

信息而不是完整的信息

模块YYY中的访问冲突XXX。在ZZZ地址写信

顺便说一句,
ExceptObject()
例程由于某种奇怪的原因返回NULL


我在这里遗漏了什么?

请参阅上的MSDN博客条目。这是两种不同类型的例外情况。试图捕捉由OS生成的结构化异常作为C++异常并不是正确的出路。 把这一点缓和一下


捕获访问冲突可能是一个很好的目标,但是您可能只想在调试上下文中执行此操作。捕获生产代码中的访问冲突(或其他主要异常)并尝试处理它们很少会导致正确的操作。

请参阅上的MSDN博客条目。这是两种不同类型的例外情况。试图捕捉由OS生成的结构化异常作为C++异常并不是正确的出路。
try {
    int * i = NULL;
    *i = 3;
}
catch (...) {
    // This would catch the access violation but you don't have any more
    // information of what has gone wrong
}
把这一点缓和一下

捕获访问冲突可能是一个很好的目标,但是您可能只想在调试上下文中执行此操作。捕获生产代码中的访问冲突(或其他主要异常)并尝试处理它们很少会导致正确的操作

try {
    int * i = NULL;
    *i = 3;
}
catch (...) {
    // This would catch the access violation but you don't have any more
    // information of what has gone wrong
}

但是,可以使用结构化异常处理(SEH)来捕获所有C++异常。因为C++异常只是基于SEH的类实现,


但是,可以使用结构化异常处理(SEH)来捕获所有C++异常。由于C++异常只是基于SEH的基于类的实现。

< P>标准C++没有指定取消空指针抛出异常-它表示它导致未定义的行为。在Windows平台上,Windows结构化异常处理在一定程度上使水变得浑浊。这与C++异常处理无关,除了一些C++运行时可以将这些Exchange转换成C++异常。但是,依赖于这种翻译的代码不是可移植的。

标准C++没有指定取消空指针抛出异常-它表示它导致未定义的行为。在Windows平台上,Windows结构化异常处理在一定程度上使水变得浑浊。这与C++异常处理无关,除了一些C++运行时可以将这些Exchange转换成C++异常。但是,依赖于此类翻译的代码是不可移植的。

在BCB5中,捕获EACCESS冲突是有效的,例如:

 #define AV_TRY { try {

 #define AV_CATCH } catch(EAccessViolation &av) {Application->MessageBox((("Access Violation caught: " + string(__FILE__) + "; " + string(__FUNC__) + "; " + IntToString(__LINE__) + "\n\n") + av.Message.c_str()).c_str(), ("Program Error in " + string(class_name.c_str())).c_str(), MB_OK);} }

请注意,class_name是特定于此项目的,可能应替换为AnsiString(this->ClassName)或省略。我还将这段代码从静默地记录到数据库,改为显示MessageBox。我只是把我在AV试验中观察到的AVs代码包装起来。。。AV_CATCH.

在BCB5中,捕捉EAccess违规行为是有效的,例如:

 #define AV_TRY { try {

 #define AV_CATCH } catch(EAccessViolation &av) {Application->MessageBox((("Access Violation caught: " + string(__FILE__) + "; " + string(__FUNC__) + "; " + IntToString(__LINE__) + "\n\n") + av.Message.c_str()).c_str(), ("Program Error in " + string(class_name.c_str())).c_str(), MB_OK);} }

请注意,class_name是特定于此项目的,可能应替换为AnsiString(this->ClassName)或省略。我还将这段代码从静默地记录到数据库,改为显示MessageBox。我只是把我在AV试验中观察到的AVs代码包装起来。。。AV_CATCH.

您只看到“Access Vialotion”,因为这是它应该工作的方式。RTL不会将整个异常数据存储到抛出的EAccessViolation对象中。至于ExceptObject(),您没有说明您使用的是哪个版本的C++Builder。在旧版本的C++中,ExabutJug()和ExtAutDRD()被认为是错误的。你只看到“访问VialOutlook”,因为这是它应该工作的方式。RTL不会将整个异常数据存储到抛出的EAccessViolation对象中。至于ExceptObject(),您没有说明您使用的是哪个版本的C++Builder。在旧版本C++中,ExpButt()和ExtAutDRD()被认为是BGGY。不,它是SEG错误,甚至catch(…)都不能捕获。不,它是SEG错误,甚至catch(…)都不能捕获。