如果C++程序中抛出异常,控制权将要么转移到异常处理程序,要么调用terminate()
。
即使程序在处理程序中(或者terminate()
处理程序中)发出一些诊断信息,这可能都已经太晚了 - 最有价值的是在抛出异常的地方的调用堆栈中,而不是在处理程序中。
在Windows上,可以使用[StackWalk64()
]1函数获得调用堆栈。关键在于如何在正确的时刻调用该函数。
是否有一种方法可以让Visual C++程序每次抛出异常(或未设置处理程序的异常)时执行一些用户代码?
如果C++程序中抛出异常,控制权将要么转移到异常处理程序,要么调用terminate()
。
即使程序在处理程序中(或者terminate()
处理程序中)发出一些诊断信息,这可能都已经太晚了 - 最有价值的是在抛出异常的地方的调用堆栈中,而不是在处理程序中。
在Windows上,可以使用[StackWalk64()
]1函数获得调用堆栈。关键在于如何在正确的时刻调用该函数。
是否有一种方法可以让Visual C++程序每次抛出异常(或未设置处理程序的异常)时执行一些用户代码?
当语言不支持它,而你又离不开它时,就得动手“hack”了… :-/
#include <iostream>
#include <stdexcept>
namespace Throw_From
{
struct Line
{
Line& set(int x) { x_ = x; return *this; }
int x_;
template <typename T>
void operator=(const T& t) const
{
throw t;
}
};
Line line;
}
#define throw Throw_From::line.set(__LINE__) =
void fn2()
{
throw std::runtime_error("abc");
}
void fn1()
{
fn2();
}
int main()
{
try
{
fn1();
}
catch (const std::runtime_error& x)
{
std::cout << Throw_From::line.x_ << '\n';
}
}
#define throw whatever
是不可行的。 - James McNellis#define THROW(E) (do_stuff(), (throw E))
- Fred Nurk