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(…)都不能捕获。