【问题标题】:Where does the text in a thrown exception go? [duplicate]抛出的异常中的文本在哪里? [复制]
【发布时间】:2012-07-31 15:45:27
【问题描述】:

可能重复:
How to print message from caught exception?

抱歉,如果这是基本的或重复的 - 我先进行了几次搜索,但没有找到任何答案。

如果我做一些基本的事情,比如:

throw exception("This thing didn't work");

在哪里可以看到?该字符串不会显示在输出控制台、堆栈跟踪或与项目关联的任何 .log 文件中。让我想知道为什么如果在任何地方都看不到它,我什至会在那里放一根绳子。我当然可以使用堆栈跟踪来查看它在哪里爆炸,但这首先违背了产生异常的目的。

在 Java 中,当我给它一个字符串时,我会在输出的某处看到该字符串。我只是想知道是否可以在 C++ 中重现这种行为。

【问题讨论】:

  • 我觉得在异常被捕获的时候可以看到。除此之外,可能是崩溃转储?
  • 正在捕获异常,是吗?
  • 从技术上讲,这是无效的。您正在使用 MS 库中的错误(std::exception 没有采用字符串的构造函数)。但是,如果您更改为std::runtime_error("This thing didn't work"),您的观点是有效的。

标签: c++ exception


【解决方案1】:

std::exception() 有一个名为what() 的成员函数。见:

http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-3.3/classstd_1_1exception.html

对于像std::logic_error 这样的东西,它会返回你传递给构造函数的文本。

【讨论】:

    【解决方案2】:

    您必须捕获异常才能看到字符串。 有一个最后的异常处理程序会很有用,如下所示:

    int main(int argc, char **argv)
    {
        try {
            ...
        }
        catch(const std::exception& e) {
            std::cout << "Uncaught exception: " << e.what() << std::endl;
        }
    }
    

    在 GUI 应用程序中,您可以在主事件循环中使用 catch 语句,并在消息框中显示错误消息。

    在事件驱动的非 GUI 应用程序中,您还可以在主事件循环中使用 catch 语句,并将错误消息写入日志文件。

    这些方法将确保您看到所有异常。当然,大多数异常应该在它们到达最后的异常处理程序之前被捕获。

    【讨论】:

    • 大概就是这个了。问题是一些崩溃是由库中的断言引起的,似乎没有办法捕捉到这些,所以即使是最后的尝试/捕捉也不能捕捉到所有东西......
    猜你喜欢
    • 2016-03-10
    • 2013-02-08
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多