¡¡¡¡Çåµ¥ 2 Öж¨ÒåµÄ SignalExceptionClass£¬ÌṩÁ˱íʾÄں˿ÉÄÜ·¢³öÐÅºÅµÄ C++ Òì³£µÄ³éÏó¡£SignalTranslator ÊÇÒ»¸ö»ùÓÚ SignalExceptionClass µÄÄ£°åÀ࣬Ëüͨ³£ÓÃÀ´ÊµÏÖµ½ C++ Òì³£µÄת»»¡£ÔÚÈκÎ˲¼ä£¬Ö»ÄÜÓÐÒ»¸öÐźŴ¦Àí³ÌÐò´¦ÀíÒ»¸ö»î¶¯½ø³ÌµÄÒ»¸öÐźš£Òò´Ë£¬SignalTranslator ²ÉÓÃÁË singleton Éè¼Æģʽ¡£ÕûÌå¸ÅÄîͨ¹ýÓÃÓÚ SIGSEGV µÄ SegmentationFault ÀàºÍÓÃÓÚ SIGFPE µÄ FloatingPointException ÀàµÃµ½ÁËչʾ¡£
¡¡¡¡Çåµ¥ 2. ½«ÐźÅת»»³ÉÒì³£
ÒýÓÃ:templateclass SignalTranslator
{
¡¡private:
¡¡¡¡class SingleTonTranslator
¡¡¡¡{
¡¡¡¡¡¡public:
¡¡¡¡¡¡¡¡SingleTonTranslator()
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡signal(SignalExceptionClass::GetSignalNumber(), SignalHandler);
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡¡¡static void SignalHandler(int)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡throw SignalExceptionClass();
¡¡¡¡¡¡¡¡}
¡¡¡¡¡¡};
¡¡public:
¡¡¡¡SignalTranslator()
¡¡¡¡{
¡¡¡¡¡¡static SingleTonTranslator s_objTranslator;
¡¡¡¡}
};
// An example for SIGSEGV
class SegmentationFault : public ExceptionTracer, public exception
{
¡¡public:
¡¡¡¡static int GetSignalNumber() {return SIGSEGV;}
};
SignalTranslatorg_objSegmentationFaultTranslator;
// An example for SIGFPE
class FloatingPointException : public ExceptionTracer, public exception
{
¡¡public:
¡¡¡¡static int GetSignalNumber() {return SIGFPE;}
};
SignalTranslatorg_objFloatingPointExceptionTranslator;