
рдЕрдкрд╡рд╛рдж рдШрдЯрдирд╛рдПрдБ
рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рд╣рдореЗрд╢рд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдШрдЯрд┐рдд рд╣реЛрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╣рдо рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬреЛ рдЕрдиреНрдп рдЙрдк-рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИред рди рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдХреЛрдб рдореЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЛрдореЗрди рдореЗрдВ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдЬреБрдбрд╝реА рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рднреА рд╣реИрдВред рдФрд░ рдмрд╕ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкреГрдердХ рдХреЛрдб рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдХ рд╕реНрдерд┐рддрд┐ рдХрд╛рдлреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рддреГрддреАрдп-рдкрдХреНрд╖ рдХреЛрдб рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, fault
рдмреНрд▓реЙрдХ рдХреЗ fault
рдЕрдкрдиреА fault
рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ:
try { // ... } catch { // do nothing, just to make code call more safe }
рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдЕрдм рдЙрддрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рднреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдХреБрдЫ рдХреЛ рджрдмрд╛ рджреЗрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд╛рдиреВрдиреА, рдЕрдкрд╡рд╛рджред рдФрд░ рдкрд░рд┐рдгрд╛рдо - рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдерд╛рди рдкрд░ рдирд┐рдореНрди рдЕрдкрд╡рд╛рдж рдХреЗ рдХрд╛рд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддреНрд░реБрдЯрд┐ рд╕реЗ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдореИрдВ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреНрдпрд╛ рдереАред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдХреЛрд░реНрд╕ рдХреНрдпрд╛ рд╣реИред рдФрд░ рдЗрд╕реЗ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ: AppDomain.FirstChanceException
рдФрд░ AppDomain.UnhandledException
ред
рдЯрд┐рдкреНрдкрдгреА
рд╣реИрдмреЗ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЕрдзреНрдпрд╛рдп рдЕрджреНрдпрддрди рдирд╣реАрдВ рд╣реИ рдФрд░, рд╢рд╛рдпрдж, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереЛрдбрд╝рд╛ рдкреБрд░рд╛рдирд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреГрдкрдпрд╛ рд╣рд╛рд▓ рдХреЗ рдкрд╛рда рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкрд░ рдЬрд╛рдПрдВ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рдЖрдк "рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддреЗ рд╣реИрдВ", рддреЛ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ Throw
рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ рдЕрдВрджрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
AppDomain.FirstChanceException
рдлреЗрдВрдХрддрд╛ рд╣реИ- рд╣реИрдВрдбрд▓рд░ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ
- рд╕реНрдЯреИрдХ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдлреНрд░реЗрдо рдореЗрдВ рдкреВрд░реНрд╡-рд░реЛрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред
- рдпрджрд┐ рдХреЛрдИ рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ
AppDomain.UnhandledException
рдХреЛ AppDomain.UnhandledException
, рдЙрд╕ рдереНрд░реЗрдб рдХреЛ рдХреНрд░реИрд╢ рдХрд░рддреЗ рд╣реБрдП рдЬрд┐рд╕рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реБрдЖред
рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддреЗ рд╕рдордп рдЖрдкрдХреЛ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрдИ рджрд┐рдорд╛рдЧреЛрдВ рдХреЛ рдкреАрдбрд╝рд╛ рджреЗрддрд╛ рд╣реИ: рдХреНрдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЛрдореЗрди рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдереНрд░реЗрдб рдХреЛ рддреЛрдбрд╝рдХрд░ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдЙрддреНрддрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рд░рд▓ рд╣реИ: рдирд╣реАрдВред рдпрджрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдмреБрд▓рд╛рдпрд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдПрдХ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: рдпрджрд┐ рд╣рдо рдПрдХ AppDomain.FirstChanceException
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ catch
) рдЕрдкрд╡рд╛рдж AppDomain.FirstChanceException
рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ AppDomain.FirstChanceException
, рддреЛ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рд░реЛрд▓ рдХреЛ рдХрд┐рд╕ рдлреНрд░реЗрдо рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? .NET CLR рдирд┐рдпрдореЛрдВ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ? рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВред рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ рд╣реИред
рджреВрд╕рд░реА рдмрд╛рдд "рдРрд╢реЛрд░" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЛ Thread
рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ AppDomain
ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрджрд┐ рдЖрдк рддрд░реНрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрд╡рд╛рдж рдХрд╣рд╛рдВ рдкреИрджрд╛ рд╣реЛрддреЗ рд╣реИрдВ? рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВред рдпрд╛рдиреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Thread
ред рддреЛ рдбреЛрдореЗрди рдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдХрд┐рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП AppDomain.FirstChanceException
рдФрд░ AppDomain.UnhandledException
? рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдмреАрдЪ - рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╛рдиреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд AppDomain
рдЬреЛ PartialTrust рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ AppDomain рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдереНрд░реЗрдбреНрд╕ рдХрд┐рд╕реА рднреА рд╕рдордп рд╡рд╣рд╛рдВ рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдереНрд░реЗрдбрдкреВрд▓ рд╕реЗ рдореМрдЬреВрджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ (рд╣рдордиреЗ рд╡рд╣ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ), рд╣рдо рдЖрдВрддрд░рд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рдкреНрд░рд╡рд╛рд╣ рдмрдирд╛рдП рдЧрдП рдереЗред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ AppDomain
рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдЬреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рд▓рд┐рдВрдХ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рджреЛ рдХреНрд╖реЗрддреНрд░реАрдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдХреБрдЫ рдРрд╕рд╛ рд╣реБрдЖ рдЬреЛ рдорд╛рдирд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ ( FirstChanceExecption
) рдФрд░ "рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИ", рдХрд┐рд╕реА рдиреЗ рдЕрдкрд╡рд╛рдж рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рд╛: рдпрд╣ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ ( Thread
) рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╣реЛрдиреЗ рд╕реЗ рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпреЛрдВ рдмреБрд░рд╛ рд╣реИ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реИрдВ?
AppDomain.FirstChanceException
рдпрд╣ рдШрдЯрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рд╕реВрдЪрдирд╛рддреНрдордХ рд╣реИ рдФрд░ рдЗрд╕реЗ "рд╕рдВрд╕рд╛рдзрд┐рдд" рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рдЖрдкрдХреЛ рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдбреЛрдореЗрди рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реБрдЖ рд╣реИ рдФрд░ рдпрд╣ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рджреМрд░рд╛рди рдпрд╛рдж рд░рдЦреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдПрдХ рд╕рд░рд▓ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:
void Main() { var counter = 0; AppDomain.CurrentDomain.FirstChanceException += (_, args) => { Console.WriteLine(args.Exception.Message); if(++counter == 1) { throw new ArgumentOutOfRangeException(); } }; throw new Exception("Hello!"); }
рдЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ? рдЬрд╣рд╛рдВ рднреА рдХреБрдЫ рдХреЛрдб рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣реЛрддреА рд╣реИ рд╡рд╣ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИред рдпрд╛рдиреА рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рдШрдЯрдирд╛ рд▓реЙрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЬреЛ рдЖрдк рдЖрдпреЛрдЬрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рджреВрд╕рд░рд╛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ FirstChanceException
рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдирд╣реАрдВ рдлреЗрдВрдХ рд╕рдХрддреЗ рдФрд░ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВред рдмрд▓реНрдХрд┐, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐: FirstChanceException рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдВрджрд░, рдЖрдк рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛рдПрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧрд░ рдХреЛрдИ рдирд╣реАрдВ рдереЗ if(++counter == 1)
рд╕реНрдерд┐рддрд┐, рддреЛ рд╣рдореЗрдВ рдПрдХ рд╕рд░реНрд╡-рдирдпрд╛ ArgumentOutOfRangeException
рд▓рд┐рдП рдЕрдирдВрдд FirstChanceException
ред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрддрд░ рдкрд░ рд╣рдореЗрдВ рдПрдХ StackOverflowException
: throw new Exception("Hello!")
FirstChanceException
throw new Exception("Hello!")
FirstChanceException
, CLR рдереНрд░реЛ рд╡рд┐рдзрд┐ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреЛ FirstChanceException
рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА FirstChanceException
рд▓рд┐рдП Throw
рдлреЗрдВрдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреБрди: рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк - рд╣рдордиреЗ counter
рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреБрдж рдХрд╛ рдмрдЪрд╛рд╡ рдХрд┐рдпрд╛ред рдпрд╛рдиреА рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ: рд╣рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Throw
рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдХреНрдпрд╛ рд╣реИ? ECMA-335 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрджрд┐ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдПрдХ ExecutionEngineException
рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП! рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдЕрд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдЖрд╡реЗрджрди рд╕реЗ рдПрдХ рдкреВрд░реНрдг рджреБрд░реНрдШрдЯрдирд╛ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ?
рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ, рд╡рд╣ FirstChanceException
рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкреВрд░реЗ рдХреЛрдб рдкрд░ FirstChanceException
try-catch
рдмреНрд▓реЙрдХ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ:
void Main() { var fceStarted = false; var sync = new object(); EventHandler<FirstChanceExceptionEventArgs> handler; handler = new EventHandler<FirstChanceExceptionEventArgs>((_, args) => { lock (sync) { if (fceStarted) { // - , - , // try . Console.WriteLine($"FirstChanceException inside FirstChanceException ({args.Exception.GetType().FullName})"); return; } fceStarted = true; try { // . , Console.WriteLine(args.Exception.Message); throw new ArgumentOutOfRangeException(); } catch (Exception exception) { // Console.WriteLine("Success"); } finally { fceStarted = false; } } }); AppDomain.CurrentDomain.FirstChanceException += handler; try { throw new Exception("Hello!"); } finally { AppDomain.CurrentDomain.FirstChanceException -= handler; } } OUTPUT: Hello! Specified argument was out of the range of valid values. FirstChanceException inside FirstChanceException (System.ArgumentOutOfRangeException) Success !Exception: Hello!
рдпрд╛рдиреА рдПрдХ рдУрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ FirstChanceException
рдЗрд╡реЗрдВрдЯ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ, рдФрд░ рджреВрд╕рд░реА FirstChanceException
, FirstChanceException
рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧрд┐рдВрдЧ рддрдХрдиреАрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реЙрдЧрд┐рдВрдЧ рдЖрдк рдХреА рддрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ FirstChanceException
рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдПрд░рд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд┐рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реА рдЪреАрдЬ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛ рддрд╛рд▓рдореЗрд▓ред рдпрд╣ рдкреНрд░рд╢реНрди рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИ: рдпрджрд┐ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЛ рдХрд┐рд╕реА рдзрд╛рдЧреЗ рдореЗрдВ рдкрд┐рд░реЛрдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдпрд╣рд╛рдВ рдХреНрдпреЛрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ FirstChanceException
рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдереНрд░реЗрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╣рд░реНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред FirstChanceException
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ AppDomain рдкрд░ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдбреЛрдореЗрди рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред рдпрд╛рдиреА рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдбреЛрдореЗрди рд╣реИ рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рдХрдИ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ FirstChanceException
рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, lock
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдкрдбрд╝реЛрд╕реА рдереНрд░реЗрдб рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдбрд╛рдпрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЛрдореЗрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдбреЛрдореЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рдХрд╛рдо рди рдХрд░реЗ рддрд╛рдХрд┐ рдЕрдиреНрдп рдкреНрд░рд╡рд╛рд╣ рдЬреЛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡реЗ рдЗрд╕ рдбреЛрдореЗрди рдХреЛ рд░рдЦ рд╕рдХреЗрдВ:
static void Main() { using (ApplicationLogger.Go(AppDomain.CurrentDomain)) { throw new Exception("Hello!"); } } public class ApplicationLogger : MarshalByRefObject { ConcurrentQueue<Exception> queue = new ConcurrentQueue<Exception>(); CancellationTokenSource cancellation; ManualResetEvent @event; public void LogFCE(Exception message) { queue.Enqueue(message); } private void StartThread() { cancellation = new CancellationTokenSource(); @event = new ManualResetEvent(false); var thread = new Thread(() => { while (!cancellation.IsCancellationRequested) { if (queue.TryDequeue(out var exception)) { Console.WriteLine(exception.Message); } Thread.Yield(); } @event.Set(); }); thread.Start(); } private void StopAndWait() { cancellation.Cancel(); @event.WaitOne(); } public static IDisposable Go(AppDomain observable) { var dom = AppDomain.CreateDomain("ApplicationLogger", null, new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory, }); var proxy = (ApplicationLogger)dom.CreateInstanceAndUnwrap(typeof(ApplicationLogger).Assembly.FullName, typeof(ApplicationLogger).FullName); proxy.StartThread(); var subscription = new EventHandler<FirstChanceExceptionEventArgs>((_, args) => { proxy.LogFCE(args.Exception); }); observable.FirstChanceException += subscription; return new Subscription(() => { observable.FirstChanceException -= subscription; proxy.StopAndWait(); }); } private class Subscription : IDisposable { Action act; public Subscription (Action act) { this.act = act; } public void Dispose() { act(); } } }
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, FirstChanceException
рдХреЛ рд╣реИрдВрдбрд▓ FirstChanceException
рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ: рдкрдбрд╝реЛрд╕реА рдбреЛрдореЗрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдереНрд░реЗрдб рдореЗрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдВрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрд╡реЗрджрди рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдиреАрдЪреЗ рдирд╣реАрдВ рд▓рд╛ рд╕рдХрддреА рд╣реИрдВред рд╕рд╛рде рд╣реА, рдЖрдк рд╕рдВрджреЗрд╢ рд▓реЙрдЧрд┐рдВрдЧ рдбреЛрдореЗрди рдХреЗ рдЕрдирд╣реЗрд▓реНрдбреЗрдб рдЕрдкрд╡рд╛рдж рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВ: рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдиреАрдЪреЗ рдирд╣реАрдВ рд▓рд╛рдПрдВрдЧреАред
AppDomain.UnhandledException
рджреВрд╕рд░рд╛ рд╕рдВрджреЗрд╢ рдЬрд┐рд╕реЗ рд╣рдо рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд╡рд╣ рд╣реИ AppDomain.UnhandledException
ред рдпрд╣ рд╕рдВрджреЗрд╢ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреБрд░реА рдЦрдмрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рдирд╣реАрдВ рдерд╛ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдереНрд░реЗрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬ рд╕рдХреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рд╣реИ, рддреЛ рд╣рдо рд╕рднреА рдРрд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ "рд╕реНрдкрд╖реНрдЯ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдиреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдзрд╛рд░рд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдХреЛрдИ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╕реНрдерд┐рддрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рдЬрдмрдХрд┐ рдзрд╛рдЧреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдереНрд░реЗрдбреНрд╕ рдХреА рдЬрдбрд╝ рдореЗрдВред рдпрд╛рдиреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк try-catch
ред рдЖрдЗрдП рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЙрдкрдпреБрдХреНрддрддрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬрд┐рд╕реЗ рдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдФрд░ рдЗрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо, рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧрд╛, рддреЛ рдпрд╣ рд╣рдорд╛рд░реА рдмрд╣реБрдд рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдзрд╛рд░рд╛ рдХреЗ рдврд╣рдиреЗ рд╕реЗ AppDomain.UnhandledException
рд╕рдВрджреЗрд╢ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╡рд┐рд╢реЗрд╖ рдзрд╛рд░рд╛ рдЗрд╕рдХреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╣реИред рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдзрд╛рд░рд╛ рднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдореЗрдВ рдЙрдирдХреА рдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрдирд╛ рдФрд░ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдпрд╛рдиреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рдкреЗрдЯреЗрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдзрд╛рдЧрд╛ рдЯреНрд░рд╛рдЗ try-catch
рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
ThreadPool.QueueUserWorkitem(_ => { using(Disposables aggregator = ...){ try { // do work here, plus: aggregator.Add(subscriptions); aggregator.Add(dependantResources); } catch (Exception ex) { logger.Error(ex, "Unhandled exception"); } } });
рдРрд╕реА рдпреЛрдЬрдирд╛ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд╣ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП: рдПрдХ рддрд░рдл, рд╣рдо рдзрд╛рд░рд╛ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝реЗрдВрдЧреЗред рджреВрд╕рд░реА рдУрд░, рд╕реНрдерд╛рдиреАрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рд╛рдл рдХрд░реЗрдВ рдпрджрд┐ рд╡реЗ рдмрдирд╛рдП рдЧрдП рдереЗред рдЦреИрд░, рдЙрдкрд╛рдВрдЧ рдореЗрдВ - рд╣рдо рдкреНрд░рд╛рдкреНрдд рддреНрд░реБрдЯрд┐ рдХреЗ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд░реБрдХрд┐рдП, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рддрд░рд╣ рдЖрдкрдиреЗ AppDomain.UnhandledException
рдЗрд╡реЗрдВрдЯ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░рд╕рд┐рджреНрдз рд░реВрдк рд╕реЗ рдЙрдЫрд╛рд▓рд╛ред рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ? рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдпрд╣ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде try-catch
рдореЗрдВ рдХреБрдЫ рдзрд╛рдЧреЗ рд▓рдкреЗрдЯрдирд╛ рднреВрд▓ рдЧрдПред рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде: рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рд╢реБрджреНрдзрд┐ рдХреЗ рд╕рд╛рдеред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реЛрдЧрд╛: рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд▓реЗрдиреЗ рдФрд░ рдмреБрдЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рдереЗред
рдкреВрд░реА рдХрд┐рддрд╛рдм рдХрд╛ рд▓рд┐рдВрдХ
