返回首页

简介
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。
,但我认为这种方法比使用更具可读性和可维护性:
#ifdef _DEBUG

    Exlogger::instance() << myInt << "sth" << myValue << EXLOG_ENDL("");

#endif
注释默认项目设置,如除以零,悬空指针的用法,等硬件相关的异常,不能陷入与标准try / catch块。你应该改变你的项目设置,以便通过以下路径:
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块,没有他们的相差不大。
有一个安全的发展。 :)

回答

评论会员:yales 时间:2012/01/26
!!Vayy Arkadas
O
评论会员:Assarbad 时间:2012/01/26
...但与VC(整篇文章你参考... ...假设,如扩大代码/##/或__FUNCSIG__)
NBSP的优势是什么?
往往不是PDB文件用VC创建书面小型转储(通过MiniDumpWriteDump),将以上的文字记录了相同的信息对您有帮助方式。一个可以自定义数据添加到转储和扩展WinDbg中,你甚至可以自动转储的评估,因为他们进来的话,甚至WinDbg中具有源代码级调试和转储分析源的支持。

的VC使用SEH实现C异常,因此任何的SEH意义上的好老例外持有持有 - 主要 - 也为C异常

所以,请什么是优势。用你的方法

总之,我有一些关于实施本身的批评:

1)你的代码是清楚的Windows / VC为中心,但升压出现依赖。
2)EXLOG_END和EXLOG_END_WITH_RETURN实施实际上是相当限制,因为你承担,从std派生的背景下,所有的异常:。异常
3)编译成一个发布版本创建了大量的膨胀闭源项目的方式更容易扭转的风险。
4)使用类似"(0){}",而不是"/##/"有关预处理器(尝试做任何假设在海湾合作委员会{S0})...任何一个精神正常的编译器进行优化

编辑:我一直在使用自己的代码/##/一段时间,直到我不得不编译跨编译器和平台{S0}一些代码