Windows рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдПрдБ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкрдврд╝рд╛ рдЧрдпрд╛ рд╡рд┐рд╖рдп " рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрдХрдбрд╝ - рдХреЛрд╢рд┐рд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ " рдореИрдВрдиреЗ рдЕрднреА рднреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдХрд╛рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЕрдкрд╡рд╛рдж (рдПрдордПрд╕ рд╡рд┐рдВрдбреЛрдЬ)ред рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдЕрд▓рдЧ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореЗрд░реА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рд░рд┐рдХреНрдЯрд░, MSDN рдФрд░ wasm.ru рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВ)ред рдмреЗрд╢рдХ, рдорд┐рдиреАрдбрдВрдк рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддреИрдпрд╛рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрд░реИрд╢ -рдкреНрдЯ рдпрд╛ Google-рдмреНрд░реЗрдХрдкреИрдб ), рдЗрд╕рд▓рд┐рдП рдпрд╣ рд▓реЗрдЦ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдЕрдзрд┐рдХ рд╢реИрдХреНрд╖рд┐рдХ рд╣реИред

рдкреНрд░рд╛рдкреНрдд рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдЖрдк рдЗрд╕реЗ рдбрд┐рдмрдЧрд░ рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд┐рдП рдЧрдП рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рд▓рд┐рдЦрдирд╛ рди рднреВрд▓реЗрдВ, рд╕рд╛рде рд╣реА рдЖрдкрдХреЛ рдбреАрдмрдЧрд┐рдВрдЧ рдкреНрд░рддреАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)ред

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ


рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдкрд╡рд╛рдж рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рд╕рднреА рдЕрдкрд╡рд╛рдж рдЖрдкрдХреЗ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рднреА рд╣реИ, __try-__except try-catch рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди __try-__except ред

рд╣рдо рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЬрд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд╕реНрдЯреИрдХ рд╕реНрдкрд┐рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЕрдкрд╡рд╛рдж рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рд╣рдо catch рд╕реНрдЯреИрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдирд╡рд╛рдВрдЯреЗрдб рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдо рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реБрдПред рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ try-catch __try-__except рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рддреЛ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ __except рдХреЛ __except рдЧрдП рдлрд╝рд┐рд▓реНрдЯрд░ рдкрд░ __except ред рдпрд╣рд╛рдВ рд╣рдо рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд╝рд┐рд▓реНрдЯрд░ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП? рдпрджрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ EXCEPTION_EXECUTE_HANDLER рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ try-catch рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдЦреИрд░, EXCEPTION_CONTINUE_SEARCH рд▓реМрдЯреЗрдВ, рдЬреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдЧрд▓реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ EXCEPTION_EXECUTE_HANDLER рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рд╣рдо try-catch , рдФрд░ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рддрдВрддреНрд░ рд╕реНрдЯреИрдХ рдкрд░ рдЖрдЧреЗ рд╣реИрдВрдбрд▓рд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдЧрд╛, try-catch рдЫреЛрдбрд╝ рджреЗрдЧрд╛ try-catch рдФрд░ рдЗрд╕ рддрд░рд╣ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ EXCEPTION_EXECUTE_HANDLER рддрд░реНрдХ рдХреЗ рд╕рд╛рде __except рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдлрд┐рд░ __try-__except(EXCEPTION_EXECUTE_HANDLER) рдореЗрдВ try-catch рдХреЛ __try-__except(EXCEPTION_EXECUTE_HANDLER) ред

рд╡реИрд╕реЗ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмреНрд▓реЙрдХ
 __except(filter()/*-> EXCEPTION_CONTINUE_SEARCH*/) { /* */ } 
рдХрднреА рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрддреЗред

рддреЛ, рд╣рдо рд╕реНрдХреЗрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ (рдпрд╣ рдирд┐рд░реНрдорд╛рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):
 __try { try { __try { useful_unsafe_function(); } __except(filter()/*-> EXCEPTION_CONTINUE_SEARCH*/) { // this block will be never executed } } catch(const your_lib::Exception& ex) { } catch(const std::exception& ex) { } catch(...) { } } __except(EXCEPTION_EXECUTE_HANDLER) { } 

рдЙрдкрдпреЛрдЧреА рдЖрд╡рд░рдг


рдЕрдм рдЖрдк рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЖрд╡рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рди рдХрд░реЗрдВ рдФрд░ рд╕рднреА рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХреЗрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реИрдкрд░ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВред

рд▓рдкреЗрдЯреЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:

рдпрджрд┐ рдЖрдкрдХрд╛ рддрд░реАрдХрд╛ рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╣реИ, рдФрд░ / рдпрд╛ рдЬреЛ рдХреБрдЫ рджреЗрддрд╛ рд╣реИ рдФрд░ / рдпрд╛ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрди рд╕рднреА рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЖрд╡рд░рдг рд╣рд╛рдЗрд▓рд╛рдЗрдЯреНрд╕:

рд╣рдорд╛рд░реЗ рдЖрд╡рд░рдг рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
  struct SafeExecutor { typedef boost::function<void()> TDoDelegate; SafeExecutor(TDoDelegate doDelegate); // true - the everything is successful // false - otherwise bool Do(); private: bool DoCPlusPlusExceptionWrapper(); bool DoWorkWrapper(); private: TDoDelegate m_DoDelegate; }; 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

Filter рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬреЛ EXCEPTION_CONTINUE_SEARCH рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
  LONG Filter( PEXCEPTION_POINTERS pep ) { // pep->ExceptionRecord->ExceptionCode // pep->ExceptionRecord->ExceptionAddress // GetModules(); // GetCallStack(); return EXCEPTION_CONTINUE_SEARCH; } 

рд╕рдмрд╕реЗ рдКрдкрд░реА рдЖрд╡рд░рдг рдЬреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЖрдЧреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
 bool SafeExecutor::Do() { bool AbnornalTermination = false; bool IsExecSuccessful = true; { __try { IsExecSuccessful = DoCPlusPlusExceptionWrapper(); } __except(EXCEPTION_EXECUTE_HANDLER) { AbnornalTermination = true; } } return !AbnornalTermination && IsExecSuccessful; } 

рджреВрд╕рд░рд╛ рдЖрд╡рд░рдг - рд╣рдо "рд╕реА ++ - рдЕрдкрд╡рд╛рдж" рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЖрдЧреЗ рд╡рд┐рддрд░рдг рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред
 bool SafeExecutor::DoCPlusPlusExceptionWrapper() { bool res = true; try { res = DoWorkWrapper(); } catch(std::exception& /*ex*/) { // smth like log(ex.what()); //assert(false); res = false; } catch(...) { // smth like log("unknown sw-exception); //assert(false); res = false; } return res; } 

рдФрд░ рддреАрд╕рд░рд╛ рдЖрд╡рд░рдг, рдЬреЛ рдХреЙрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ Filter рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 bool SafeExecutor::DoWorkWrapper() { bool res = false; if (!m_DoDelegate.empty()) { __try { m_DoDelegate(); res = true; } __except(Filter(GetExceptionInformation())) // we must dump callstack inside this Filter { // never be executed because Filter always returns `CONTINUE_SEARCH` } } return res; } 

Google рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдкрд░ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж:
  int HWUnsafe() { int z = 0; return 1/z; } TEST(HWUnsafe, SafeExecutor) { SafeExecutorNS::SafeExecutor se(HWUnsafe); ASSERT_FALSE(se.Do()); } 

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рдж:
  int SWUnsafe1() { int z = 1; throw std::exception(); return 1/z; } TEST(SW_std_ex, SafeExecutor) { SafeExecutorNS::SafeExecutor se(SWUnsafe1); ASSERT_FALSE(se.Do()); } 

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╕рдВрдЪрд╛рд▓рди рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред

Source: https://habr.com/ru/post/In163745/


All Articles