【问题标题】:Handle access violation exception in C++ Builder?在 C++ Builder 中处理访问冲突异常?
【发布时间】:2020-10-09 01:03:24
【问题描述】:

我正在努力:

try{
    int * i = NULL;
    *i = 3;
}catch(Exception &Err){
    ShowMessage(Err.Message);
}

我认为这应该捕获访问冲突异常并通过显示错误消息来处理它。

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

访问冲突

消息而不是完整的消息

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

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

我在这里错过了什么?

【问题讨论】:

  • 您只看到“Access Vialition”,因为它应该是这样工作的。 RTL 不会将整个异常数据存储到被抛出的 EAccessViolation 对象中。至于 exceptObject(),你没有说你使用的是哪个版本的 C++Builder。 exceptObject() 和 exceptAddr() 已知在旧版本的 C++ 中存在错误。

标签: exception exception-handling c++builder access-violation


【解决方案1】:

在 BCB5 中,捕获 EAccessViolation 有效,例如:

 #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_TRY ... AV_CATCH 中观察到 AV 的代码包装起来。

【讨论】:

    【解决方案2】:

    请参阅 Mixing SEH and C++ Exceptions 上的 MSDN 博客条目。这是两种不同类型的异常。试图将操作系统生成的结构化异常作为 C++ 异常捕获并不是开箱即用的正确方法。 用this posting on not doing that 调和这个位。

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

    【讨论】:

      【解决方案3】:

      标准 C++ 没有指定取消引用 NULL 指针会引发异常 - 它说它会导致未定义的行为。在 Windows 平台上,Windows 结构化异常处理使水有些混乱。这与 C++ 异常处理无关,只是某些 C++ 运行时可能会将这些异常转换为 C++ 异常。但是,依赖于这种翻译的代码是不可移植的。

      【讨论】:

        【解决方案4】:
        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 的基于类的实现。

        【讨论】:

        • 不,这是一个段错误,甚至 catch(...) 也无法捕获。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多