C 获取std :: out_of_range异常的位置

C++ Getting Location of std::out_of_range Exceptions

本文关键字:异常 位置 range of 获取 out std      更新时间:2023-10-16

我正在研究一个相当冗长的程序,在运行良好一段时间后,我突然得到了:

terminate called after throwing an instance of 'std::out_of_range'
 what(): basic_string::substr

是异常处理的新手,我进行了一些研究,发现我可能会通过将以下内容添加到我的主要功能中获取更多信息:

int main(int argc, char **argv){
    try{
        //stuff
    }
    catch(exception const &exc){
        cerr << "Caught exception: " << exc.what() << endl;
    }
}

结果是以下输出:

Caught exception: basic_string::substr

这并不比默认输出更有用。它没有告诉我有关触发核心转储的行的任何信息(我的程序中有许多substr调用(,substr试图处理的数据等。是否有一种在C 中显示此类信息的方法我唯一使用调试器(例如GDB(的选项是?

有几种方法。

  1. 正如您所说的,调试器 - 但一旦代码在生产中,这对您没有帮助。

  2. 嵌套异常和功能尝试块。例如:

&nbsp;

#include <exception>
#include <stdexcept>
#include <iostream>
#include <sstream>
#include <iomanip>
void bar(std::string& s, int i)
try
{
    s.at(i) = 'A';
}
catch(...)
{
    std::ostringstream ss;
    ss << "error in bar(" << std::quoted(s) << ", " << i << ")";
    std::throw_with_nested(std::runtime_error(ss.str()));
}
void foo(std::string& s)
try
{
    bar(s, 6);
}
catch(...)
{
    std::ostringstream ss;
    ss << "error in foo(" << std::quoted(s) << ")";
    std::throw_with_nested(std::runtime_error(ss.str()));
}
void stuff()
try
{
    std::string s;
    foo(s);
}
catch(...)
{
    std::throw_with_nested(std::runtime_error("error in stuff()"));
}
void print_exception(std::ostream& os, const std::exception& e, int level =  0)
{
    os << std::string(level, ' ') << "exception: " << e.what() << 'n';
    try {
        std::rethrow_if_nested(e);
    } catch(const std::exception& e) {
        print_exception(os, e, level+1);
    } catch(...) {}
}
int main()
{
    try{
        stuff();
    }
    catch(std::exception& e)
    {
        print_exception(std::cerr, e);
        return 127;
    }
    return 0;
}

样本输出:

exception: error in stuff()
 exception: error in foo("")
  exception: error in bar("", 6)
   exception: basic_string::at: __n (which is 6) >= this->size() (which is 0)
  1. 您可以使用boost::stacktrace代替上述异常处理。

http://coliru.stacked-crooked.com/a/f21bd35632a0a036

相关文章: