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

рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдХрд╛рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рдЕрдкрд╡рд╛рдж (рдПрдордПрд╕ рд╡рд┐рдВрдбреЛрдЬ)ред рд╣рдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдЕрд▓рдЧ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдореЗрд░реА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рд░рд┐рдХреНрдЯрд░, 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()) { }
рдХрднреА рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрддреЗред
рддреЛ, рд╣рдо рд╕реНрдХреЗрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ (рдпрд╣ рдирд┐рд░реНрдорд╛рдг рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ):
__try { try { __try { useful_unsafe_function(); } __except(filter()) {
рдЙрдкрдпреЛрдЧреА рдЖрд╡рд░рдг
рдЕрдм рдЖрдк рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЖрд╡рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рди рдХрд░реЗрдВ рдФрд░ рд╕рднреА рдХреЛ рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХреЗрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реИрдкрд░ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИрдВред
рд▓рдкреЗрдЯреЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:
- рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рдЖрд╡рд░рдг рд╕реЗ рдкрд░реЗ рдирд╣реАрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (
function<void()>
- рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд░реИрдкрд░ рдХреЛ
false
рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдХреЗ рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЖрдкрдХрд╛ рддрд░реАрдХрд╛ рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рд╣реИ, рдФрд░ / рдпрд╛ рдЬреЛ рдХреБрдЫ рджреЗрддрд╛ рд╣реИ рдФрд░ / рдпрд╛ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрди рд╕рднреА рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдЖрд╡рд░рдг рд╣рд╛рдЗрд▓рд╛рдЗрдЯреНрд╕:
рд╣рдорд╛рд░реЗ рдЖрд╡рд░рдг рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
struct SafeExecutor { typedef boost::function<void()> TDoDelegate; SafeExecutor(TDoDelegate doDelegate);
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
Filter
рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬреЛ
EXCEPTION_CONTINUE_SEARCH
рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
LONG Filter( PEXCEPTION_POINTERS pep ) {
рд╕рдмрд╕реЗ рдКрдкрд░реА рдЖрд╡рд░рдг рдЬреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЖрдЧреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред
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& ) {
рдФрд░ рддреАрд╕рд░рд╛ рдЖрд╡рд░рдг, рдЬреЛ рдХреЙрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░
Filter
рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
bool SafeExecutor::DoWorkWrapper() { bool res = false; if (!m_DoDelegate.empty()) { __try { m_DoDelegate(); res = true; } __except(Filter(GetExceptionInformation()))
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()); }
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╕рдВрдЪрд╛рд▓рди рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред