處理 C++ 中的異常會在語言級別上遇到少許隱含限制,但在某些情況下,您可以繞過它們。學(xué)習各種利用異常的方法,您就可以生產(chǎn)更可靠的應(yīng)用程序。
保留異常來源信息
學(xué)在C++中,無論何時在處理程序內(nèi)捕獲一個異常,關(guān)于該異常來源的信息都是不為人知的。異常的具體來源可以提供許多更好地處理該異常的重要信息,或者提供一些可以附加到錯誤日志的信息,以便以后進行分析。
為了解決這一問題,可以在拋出異常語句期間,在異常對象的構(gòu)造函數(shù)中生成一個堆棧跟蹤。ExceptionTracer 是示范這種行為的一個類。
清單 1. 在異常對象構(gòu)造函數(shù)中生成一個堆棧跟蹤
// Sample Program:
// Compiler: gcc 3.2.3 20030502
// Linux: Red Hat
#include
#include
#include
#include
using namespace std;
////////////////////////////
/////////////////
class ExceptionTracer
{
public:
ExceptionTracer()
{
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for (int i = 0; i < nSize; i++)
{
cout << symbols[i] << endl;
}
free(symbols);
}
};
保留異常來源信息
學(xué)在C++中,無論何時在處理程序內(nèi)捕獲一個異常,關(guān)于該異常來源的信息都是不為人知的。異常的具體來源可以提供許多更好地處理該異常的重要信息,或者提供一些可以附加到錯誤日志的信息,以便以后進行分析。
為了解決這一問題,可以在拋出異常語句期間,在異常對象的構(gòu)造函數(shù)中生成一個堆棧跟蹤。ExceptionTracer 是示范這種行為的一個類。
清單 1. 在異常對象構(gòu)造函數(shù)中生成一個堆棧跟蹤
// Sample Program:
// Compiler: gcc 3.2.3 20030502
// Linux: Red Hat
#include
#include
#include
#include
using namespace std;
////////////////////////////
/////////////////
class ExceptionTracer
{
public:
ExceptionTracer()
{
void * array[25];
int nSize = backtrace(array, 25);
char ** symbols = backtrace_symbols(array, nSize);
for (int i = 0; i < nSize; i++)
{
cout << symbols[i] << endl;
}
free(symbols);
}
};

