简介
C开发人员通常试图找到把自己的代码中的日志记录语句(法庭等)是怎么回事的错误/异常。有些人选择使用喜欢Dr.Watson的软件调用堆栈,找到异常的位置与一些努力。正如你所知道的,唯一的办法是使用try / catch块捕获异常。但是,把这些块使代码的可读性,也许更因为在catch块中的语句容易出错。
我在座的一些易于使用的的宏把这些的try / catch代码块。宏将让你捕获异常并记录在一个文件中异常的位置。如果你在代码中使用的宏,发生异常时,你将能看到一个调用堆栈。
也可以禁用异常抛出,使你的程序将生活没有例外。使用代码
使用宏是很容易的。假设你有一个名为MyMethod的功能:void myMethod()
{
EXLOG_START
...
...
EXLOG_END
}
EXLOG_START是一个简单的尝试表达。另一方面,EXLOG_END是错误记录机制的catch块。
在MyMethod的功能发生异常时,它会被捕获并记录在一个文件中中。之后,如果异常抛出是不会被禁用(会被告知),异常将被抛出MyMethod的来电功能。如果你有把艾克斯劳格报表的功能,将记录异常的主要功能。
您可以禁用艾克斯劳格的异常抛出该异常被捕获,记录,程序将尝试继续运行。您可以在任何您的代码使用部分:{C}
的某些功能可能返回,而不是空值。对于这些功能,你应该使用另一个宏EXLOG_END_WITH_RETURN,允许这些函数返回一个值发生异常时:int myMethodWithReturn()
{
EXLOG_START
...
...
EXLOG_END_WITH_RETURN(-1)
}
,因此,如果有一个例外,myMethodWithReturn将返回-1(这是假设此功能的默认值),主叫方获取-1,程序将继续运行。
与宏一起,ExLogger类也很重要。它是类的日志文件的详细信息。它使用Boost的日期和时间类,以得到一个文件/日志唯一的名称。所以,你应该提高的库添加到项目中。
,您还可以使用ExLogger登录任何文件。这是一个Singleton类重载LT,LT,运营商,让你写的简单和可读的代码,如果你是书面形式向法院。你可以通过使用宏艾克斯劳格的一个实例:
EXLOG_ENDL是类似的到std::endl这将导致日志流被刷新到文件。兴趣点
艾克斯劳格宏在代码中,多变的一个定义:EXLOG_ENABLED。我已经把这个定义在头,但你可以把你的预处理部分,以便您可以启用/禁用艾克斯劳格只是一个定义相关的代码。
如果EXLOG_ENABLED未启用,宏将被替换的/ /注释的表达。因此,表达式将被注释掉。这种用法只有一个小问题:如果你想禁用这个定义艾克斯劳格的报表,你应该把在单行艾克斯劳格报表。
因此,例如:EXLOG << myInt << "sth" << myValue << EXLOG_ENDL("");
是安全的。但是:
将导致编译错误,如果你没有定义EXLOG_ENABLED。
,但我认为这种方法比使用更具可读性和可维护性:
注释默认项目设置,如除以零,悬空指针的用法,等硬件相关的异常,不能陷入与标准try / catch块。你应该改变你的项目设置,以便通过以下路径:#ifdef _DEBUG
Exlogger::instance() << myInt << "sth" << myValue << EXLOG_ENDL("");
#endif
Project Properties >> C/C++ >> Code Generation >> Enable C++ Exceptions
(/ EHA)SEH异常值设置为Yes。另一个设置是STL类。这些类包含许多断言。正如你所知道的,断言不能被捕获。为了避免这种情况,你也应该定义在该项目的预处理器设置这些值:_SECURE_SCL=0 ve _HAS_ITERATOR_DEBUGGING=0
,但是请记住,设置在所有进口项目这些预处理器设置!因此,这最后的设置是可选的的。如果你不定义这些预处理值,STL的异常可能不会被捕获/记录,但被告知断言。讨论
您可能会想到,把TRY / CATCH可能会影响性能。但是你可以舒适的使用try / catch块时。我搜索了很多论坛,也取得了性能测试。只有一个try / catch块,没有他们的相差不大。
有一个安全的发展。 :)