рд╕рд╛рд░рд╛рдВрд╢
рдПрдХ рдирдпрд╛ try
рдирд┐рд░реНрдорд╛рдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ if
-рдПрдХреНрд╕рдкреНрд░реЗрд╕реЗрдВрд╕ рдЖрдорддреМрд░ рдкрд░ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рд▓реЗрдЦрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдореГрджреНрдз рдпрд╛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП defer
рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЫреЛрдЯрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рднрд╛рд╖рд╛ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд┐рдП рдмрд┐рдирд╛ред
try
рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрдд рд╣реИред рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рднреА рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИред
рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЪрд░реНрдЪрд╛ рдЕрдиреБрднрд╛рдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рдбрд┐рдЬрд╛рдЗрди рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЬрдирд╛ рдФрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдЙрддреНрддрд░реЛрдВ рдХрд╛ рдПрдХ рдЦрдВрдб рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкрд░рд┐рдЪрдп
рдбреЗрдирд╡рд░ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЧреЛрдлрд░рдХреЛрди рд╕рдореНрдореЗрд▓рди рдореЗрдВ, рдЧреЛ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп (рд░рд╕ рдХреЙрдХреНрд╕, рдорд╛рд░реНрд╕реЗрд▓ рд╡реИрди рд▓реЛрд╣реБрдЗрдЬрд╝рди) рдиреЗ рдЧреЛ ( рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди ) рдореЗрдВ рдореИрдиреБрдЕрд▓ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдердХрд╛рдКрддрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирдП рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдПред рддрдм рд╕реЗ рд╣рдореЗрдВ рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ Russ рдХреЙрдХреНрд╕ рдиреЗ рд╕рдорд╕реНрдпрд╛ рдХреА рдЕрдкрдиреА рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдмрддрд╛рдпрд╛, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдзрд┐рдХ рд╣рд▓реНрдХрд╛ рдмрдирд╛рдирд╛ рд╣реИред рд╣рдо рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реБрдП рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрднреА рднреА рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕рдорд░реНрдкрд┐рдд рдХрд░реЗрдВрдЧреЗред рдЙрд╕реА рд╕рдордп, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдорд╕реМрджреЗ рдХреЗ рдорд╕реМрджреЗ рдореЗрдВ рдЬрд┐рди рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд╡реЗ рдирдП рдпреВрдирд┐рд░реА check
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░реНрд╕ ( handle
) рдХреА рдШреЛрд╖рдгрд╛ рдФрд░ рдЗрди рджреЛ рдирдП рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдлреАрдбрдмреИрдХ рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рд╣реИрдВ, рд╡реЗ handle
рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╡рд┐рд╡рд░рдг рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ check
рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЕрдзрд┐рдХ рдЖрдХрд░реНрд╖рдХ рдирд┐рдХрд▓рд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдореБрджрд╛рдп рдХреЗ рдХрдИ рд╕рджрд╕реНрдпреЛрдВ рдиреЗ рдПрдХ check
рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдкреЛрд╕реНрдЯ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЕрд▓рдЧ рд╣реИ, рдЗрди рддреАрдиреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдорд╕реМрджрд╛ рдбрд┐рдЬрд╛рдЗрди рдкрд░ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ред
рддрд╕реНрд╡реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╡рд┐рдХреА рдкреГрд╖реНрда рдкрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд╕реБрдЭрд╛рд╡ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд▓рд┐рдпрд╛рдо рдмреНрд░реЗрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд╡реНрдпрд╛рдкрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ред
рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд░рдпрд╛рди рд╣рд┐рд▓рдореИрди рдиреЗ рдУрдЧ рд░реАрд░рд╛рдЗрдЯ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдкрд╣рд▓реЗ try
рдереА рдФрд░ рдЗрд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ред рджреЗрдЦреЗрдВ ( https://news.ycombinator.com/item?id=20101417 )ред
рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдп рдлрд╝рдВрдХреНрд╢рди
рдкреНрд░рд╕реНрддрд╛рд╡
рд╣рдорд╛рд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдирдП рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕реЗ рднрд╛рд╖рд╛ рддрддреНрд╡ рдХреЛ try
рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдП
func try(expr) (T1, T2, ... Tn)
рдЬрд╣рд╛рдВ expr
рдорддрд▓рдм рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдлрдВрдХреНрд╢рди рдХреЙрд▓) рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬреЛ рдХрд┐ T1, T2, ... Tn
+ 1 рдорд╛рдиреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рдорд╛рди рдХреЗ рд▓рд┐рдП n + 1 рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ expr
рдПрдХ рдПрдХрд▓ рдорд╛рди (n = 0) рд╣реИ, рддреЛ рдпрд╣ рдорд╛рди рдЯрд╛рдЗрдк error
рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ try
рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рди рдЖрдПред рдХреЙрд▓рд┐рдВрдЧ try
рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ error
рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
try
рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕рдХрд╛ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд╕реА рдорд╛рди рдкреНрд░рдХрд╛рд░ error
ред рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ try
рдХреЛ рдХреЙрд▓ try
рд╕реЗ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ f()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХреЙрд▓ try
рдХрд░реЗрдВ
x1, x2, тАж xn = try(f())
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:
t1, тАж tn, te := f()
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрдЧрд░ expr
рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдЕрдВрддрд┐рдо error
рдкреНрд░рдХрд╛рд░ nil
, рддреЛ рдЕрдВрддрд┐рдо nil
рдХреЛ рд╣рдЯрд╛рдХрд░, рдмрд╕ рдкрд╣рд▓реЗ n рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ try
ред
рдпрджрд┐ рдЕрдВрддрд┐рдо рдорд╛рди expr
рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ:
- рдПрдиреНрдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА
error
рд╡рд╛рдкрд╕реА рдорд╛рди ( error
рдирд╛рдо рд╕реЗ рдКрдкрд░ рдЫрджреНрдо рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЛрдИ рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдпрд╛ рдЕрдирд╛рдо рд╡рд╛рдкрд╕реА рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рддреНрд░реБрдЯрд┐ рдорд╛рди expr
рд╕реЗ expr
- рд▓рд┐рдлрд╝рд╛рдлрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рд╣реИ
- рдпрджрд┐ рдПрдиреНрдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрди рдорд╛рдиреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐
try
рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдирдореЗрдВ рдирд┐рд╣рд┐рдд рдереЗред - рдпрджрд┐ рдПрдиреНрдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдирд╛рдо рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╢реВрдиреНрдп рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреЛ рдЙрдирдХреЗ рдореВрд▓ рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡реЗ рдЖрд░рдВрднрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ)ред
рдпрджрд┐ try
рдХрдИ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ, рдФрд░ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ (рдЗрд╕рдХреЗ рдмрд╛рдж рдирд╣реАрдВ-n- рд▓рдЧрднрдЧред рдкреНрд░рддрд┐ред) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЪрд░ рджреНрд╡рд╛рд░рд╛) рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдХреЛрдИ рднреА рдЪрд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ try
рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓ рддрднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреА try
рдЬрд╛рддреА рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдирдХреНрд▓реЛрдЬрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдирддреАрдЬрддрди, рдпрджрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдХреЗ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ try
рдХрд╛ рдЙрдкрдпреЛрдЧ try
рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдм рд╕рд╛рдордирд╛ рдХрд┐рдП рдЧрдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ a,b, err
рдирд╛рдо рдПрдирдХреНрд▓реЛрдЬрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдб рд╣реИ:
a, b, err = f() if err != nil { return }
рд╣рдореЗрд╢рд╛ рдЪрд░реЛрдВ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдЧрд╛ a, b
рдФрд░ err
, рднрд▓реЗ рд╣реА рдХреЙрд▓ рдЯреВ f()
рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рдП рдпрд╛ рдирд╣реАрдВред рд╡рд┐рдкрд░реАрдд рдЪреБрдиреМрддреА
a, b = try(f())
рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, a
рдФрд░ b
рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝ рджреЗрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдПрдХ рд╕реВрдХреНрд╖реНрдо рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХрд╛рдлреА рджреБрд░реНрд▓рдн рд╣реИрдВред рдпрджрд┐ рдмрд┐рдирд╛ рд╢рд░реНрдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреЗ рдЙрдкрдпреЛрдЧ
try
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ: рдмрд╣реБрдд рд╕рд╛рд░реЗ if
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ try
рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
f, err := os.Open(filename) if err != nil { return тАж, err
рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
f := try(os.Open(filename))
рдпрджрд┐ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ try
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЪрд░реНрдЪрд╛ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ)ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдХреЛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ), рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, if
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рддрдВрддреНрд░ рдмрдирд╛ рд╣реБрдЖ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ try
рд╕рд╛рде рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реИред рдХреЛрдб рдЬрд┐рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкрд░реАрдХреНрд╖рдг рдФрд░ рдХреЛрд╢рд┐рд╢
рдПрдХ рд╡рд┐рд╡рд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдореЗрдВ (рдиреАрдЪреЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ), рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдШрдмрд░рд╛рд╣рдЯ рдХреА try
рдереАред рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ testing
рдкреИрдХреЗрдЬ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ try
рдХрд╛ рдЙрдкрдпреЛрдЧ try
рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ, testing
рдкреИрдХреЗрдЬ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ
func TestXxx(*testing.T) error func BenchmarkXxx(*testing.B) error
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ try
рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ t.Fatal(err)
рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рд╡рд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ t.Fatal(err)
рдпрд╛ b.Fatal(err)
t.Fatal(err)
рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░, try
рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░ (рд╡рд╛рдкрд╕реА рдпрд╛ рдЖрддрдВрдХ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдПрдХ рдЦрд╛рдореА рдпрд╣ рд╣реИ рдХрд┐ t.Fatal
рдФрд░ b.Fatal
рдЙрд╕ рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЧрд┐рд░ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдФрд░ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдк-рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдПрдХ рдЦреБрд▓рд╛ рдкреНрд░рд╢реНрди рд╣реИ; рд╣рдо рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ testing
рдкреИрдХреЗрдЬ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
# 21111 рднреА рджреЗрдЦреЗрдВ, рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐
рдореВрд▓ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛рдлреА рд╣рдж рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдпрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЗ рд╕рдорд░реНрдерди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред рдбреНрд░рд╛рдлреНрдЯ рдиреЗ рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб handle
рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдирдИ рднрд╛рд╖рд╛ рдЧреИрд░-рддреБрдЪреНрдЫ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдХрд╛рд░рдг рдордХреНрдЦрд┐рдпреЛрдВ рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, handle
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмреБрд░реА рддрд░рд╣ рд╕реЗ defer
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд╛рд░ рд╣реЛ рдЧрдИ, рдЬрд┐рд╕рдиреЗ рдирдИ рднрд╛рд╖рд╛ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЧреИрд░-рдСрд░реНрдереЛрдЧреЛрдирд▓ рдХреЛ рд╕рдм рдХреБрдЫ рдмрдирд╛ рджрд┐рдпрд╛ред
рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдореВрд▓ рдбреНрд░рд╛рдлреНрдЯ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рд░ рддрдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрд╡рд░реНрдзрди рдпрд╛ рддреНрд░реБрдЯрд┐ рд░реИрдкрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ: рдпрджрд┐ рдЧрд▓рдд рд╣реИ if err != nil { return err}
рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ if err != nil { return err}
, рдпрд╛ defer
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
defer func() { if err != nil {
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, error
рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА error
рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо рд╣реИред
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ
func HandleErrorf(err *error, format string, args ...interface{}) { if *err != nil { *err = fmt.Errorf(format + ": %v", append(args, *err)...) } }
рдпрд╛ рдРрд╕рд╛ рд╣реА рдХреБрдЫред fmt
рдкреИрдХреЗрдЬ рдРрд╕реЗ рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕реНрдерд╛рди рдмрди рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА fmt.Errorf
рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ)ред рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдХреЙрдкреА" рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдореГрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
рдЕрдЧрд░ fmt.HandleErrorf
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рднрд╛рд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдирдП рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд▓реМрдЯрд╛рдП рдЧрдП рддреНрд░реБрдЯрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд╛рдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдо рд╕рдЯреАрдХ рдПрдкреАрдЖрдИ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдлрдПрдХреНрдпреВ рджреЗрдЦреЗрдВ)ред рд╣рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд▓реЗрдЦрди рдХреА рдЙрдкрдпреБрдХреНрдд рд╢реИрд▓реА рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдкрд░ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрджрдд рд╣реЛ рдЬрд╛рдПрдЧреАред
рджрдХреНрд╖рддрд╛ рдореЗрдВ рдмрд╛рдзрд╛
рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ defer
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░ рджрдХреНрд╖рддрд╛ рд╣реИред defer
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдзреАрдорд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХреБрд╢рд▓ рдХреЛрдб рдФрд░ рдЕрдЪреНрдЫреЗ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдмреАрдЪ рдЪрдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЧреЛ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЯреАрдореЛрдВ рдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рдФрд░ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдореМрдЬреВрджрд╛ "рдореИрдиреБрдЕрд▓" рдХреЛрдб рдХреА рджрдХреНрд╖рддрд╛ рдореЗрдВ рддреБрд▓рдиреАрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЧреЛ 1.14 рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ ( рд╕реАрдПрд▓ 171158 рдЯрд┐рдХрдЯ рднреА рджреЗрдЦреЗрдВ, рдЬреЛ рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИ)ред
рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ go try(f), defer try(f)
try
рдирд┐рд░реНрдорд╛рдг рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ try
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ go
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЪреАрдЬреЗрдВ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ:
go try(f())
рдпрд╣рд╛рдБ f()
рдХреЛ рддрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд░реНрддрдорд╛рди goroutine рдореЗрдВ рдЧреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрд▓рд┐рдВрдЧ f
рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ try
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирдП рдЧреЛрд░рдЖрдЙрдЯ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ f
рдПрдХ рдиреЙрдирдЬрд╝реЗрд░реЛ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдПрдиреНрдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рдХреА try
; рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЯрд╛рдЗрдк error
рдХрд╛ рдХреЛрдИ рд░рд┐рдЯрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЧреЛрд░рдЖрдЙрдЯ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдо try
рдХрд┐ рдПрдХ рдмрд╛рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЕрдХреНрд╖рдо рд╣реЛрдиреЗ рдХрд╛ try
ред
рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐
defer try(f())
рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрд╕реНрдердЧрд┐рдд рдЕрд░реНрде рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдпрд╣ рд╕рдВрд▓рдЧреНрдирдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛, рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреА try
рджреЗрд░реА рд╣реЛрдЧреАред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, f()
рдореВрд▓реНрдпрд╛рдВрдХрди рддрдм рдХрд┐рдпрд╛ f()
рд╣реИ рдЬрдм defer
, рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реНрдердЧрд┐рдд try
рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдПрдиреНрдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐ try
рдЬрд╛рдБрдЪ рдХрд░реЗрдВ f()
рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдХреНрд╖рдг рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред рдкрд░рд┐рд╡рд░реНрддрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛, рдРрд╕реА рддреНрд░реБрдЯрд┐ рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ рдЬреЛ рдПрдиреНрдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рд▓реМрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдпрд╣ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рднрдбрд╝рдХрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреЙрд▓ рдХреЛ defer
try
рдФрд░ рд╕рд╛рде рд╣реА defer
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ defer
рднреА try
ред рд╣рдо рдЗрд╕ рдирд┐рд░реНрдгрдп рдкрд░ рд╣рдореЗрд╢рд╛ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХрд╛ рдПрдХ рдЙрдЪрд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдмрд╛рдХреА рдмрд┐рд▓реНрдЯ-рдЗрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рддрд░рд╣, try
рдХреЗрд╡рд▓ рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ; рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ рдЪрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ f := try
(рдЬреИрд╕рд╛ рдХрд┐ f := print
рдФрд░ f := new
рдирд┐рд╖рд┐рджреНрдз рд╣реИ) рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЪрд░реНрдЪрд╛
рдбрд┐рдЬрд╛рдЗрди рдкрд░рд┐рд╡рд░реНрддрди
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд╣рд▓реЗ рдХреЗ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЪрд░реНрдЪрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдиреНрдпреВрдирддрдо рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдмрдиреАред рд╣рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЪрдпрдирд┐рдд рдбрд┐рдЬрд╛рдЗрди рдирд┐рд░реНрдгрдпреЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓реЗрдЧрд╛ред
рдЗрд╕ рд╡рд╛рдХреНрдп рдХреА рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд▓реЗрдЦ рдХреЗ рджреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдереА "рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдореБрдЦ рднрд╛рдЧреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛", рдЕрд░реНрдерд╛рддреН, рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдирдИ рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрдЬрд╛рдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЧреЛ рдлрд╝рдВрдХреНрд╢рдиред рдЙрд╕ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдорд╛рд░реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрд╛рд╕ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╡рд╛рд▓реА func(error) error
рдереАред рдпрджрд┐ try
рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереА, рддреЛ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдПрдиреНрдХреНрд▓реЛрдЬрд╝рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
handler := func(err error) error { return fmt.Errorf("foo failed: %v", err)
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рдкреНрд░рднрд╛рд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдиреБрдорддрд┐ рджреА, рд▓реЗрдХрд┐рди рдЗрд╕рдиреЗ рдХрдИ рд╕рд╡рд╛рд▓ рднреА рдЙрдард╛рдП рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╣реА рдЙрддреНрддрд░ рдирд╣реАрдВ рдереЗ: рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдирд┐рд▓ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдЖрдкрдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреА рдХрдореА рдХреЗ рд░реВрдк рдореЗрдВ рдШрдмрд░рд╛рдиреЗ рдпрд╛ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди try
рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЧреИрд░-рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдЕрд╢рдХреНрдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ "рд░рджреНрдж" рд╣реИ? рдпрд╛ рдПрдХ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЦрд╛рд▓реА рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП? рдпрд╣ рднреА рд╕рдВрджреЗрд╣ рдерд╛ рдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛ред рд╣рд░ рдЬрдЧрд╣ рд╕рд╣реА рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд░рдирд╛ рднреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди try
рдПрдХ рдЙрдкрдпреЛрдЧ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдФрд░ рдкрд╕рдВрдж рд╣реИред
рдЕрдЧрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ, рдХрд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП defer
рдХрд╛ рдЙрдкрдпреЛрдЧ defer
рдкрдХреНрд╖ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛ рджрд┐рдпрд╛ред рдЗрд╕ рдХрджрдо рдиреЗ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдореБрджреНрджреЛрдВ рдХреЛ рднреА рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдорд╛рдВрдЧ рдХреА рдХрд┐ error
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛рдП рдпрджрд┐ рдкрд╣реБрдВрдЪ рдЖрд╡рд╢реНрдпрдХ рдереА (рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдерд╛)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рднреАрддрд░ рди рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ try
, рд╕рдВрджрд░реНрдн-рд╕рдВрд╡реЗрджреА рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛: рдпрджрд┐ try
рдЙрдкрдпреЛрдЧ рдкреИрдХреЗрдЬ рд╕реНрддрд░ рдкрд░ рдХрд┐рдпрд╛ try
, рдпрд╛ рдпрджрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ try
ред (рдФрд░ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреА рд╡рдЬрд╣ рд╕реЗ, рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЙрд╕ рд╡рд╛рдХреНрдп рдореЗрдВ try
рдмрдЬрд╛рдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред) try
рдХрд╛ рд╕рдВрджрд░реНрдн-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ (рдпрд╛ must
) рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдФрд░ рднреА рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд░рд╣рд╛ рдерд╛: рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛ред рдкреИрдХреЗрдЬ рдЪрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ред рдЗрд╕рдиреЗ testing
рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ try
рдХрд╛ рдЙрдкрдпреЛрдЧ try
рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рднреА рдЦреЛрд▓реАред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╕рдВрджрд░реНрдн-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рдерд╛: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ try
рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪреБрдкрдЪрд╛рдк рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ (рдШрдмрд░рд╛рд╣рдЯ рдпрд╛ рдирд╣реАрдВ) рдЬрдм рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╡рд╛рдкрд╕реА рддреНрд░реБрдЯрд┐ рдЬреЛрдбрд╝рддреЗ рдпрд╛ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рднреА рдЦрддрд░рдирд╛рдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдпрд╣ рдерд╛ рдХрд┐ try
рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдФрд░ must
рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, ( # 31442 рдореЗрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕реА рддрд░рд╣)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрдмрдХрд┐ рдХреЗрд╡рд▓ try
рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╕рдорд░реНрдерди рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ, рджреВрд╕рд░реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдордиреЗ try
рдХреЗ рджреЛрд╣рд░реЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдбрд┐рдЬрд╛рдЗрди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ
рдпрд╣ рд╕реБрдЭрд╛рд╡ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреЗ рдорд╕реМрджреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЪрдпрдирд┐рдд рд╕рдорд╛рдзрд╛рди рдЙрдЪрд┐рдд рд╣реИрдВ:
рдкрд╣рд▓реЗ рдЪреАрдЬреЗрдВ, рдкрд╣рд▓реЗ, рдмрд┐рдирд╛ рдХрд┐рд╕реА handle
рдХреЗ рдореВрд▓ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд check
рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рд╣реИрдВред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдореВрд▓ рдорд╕реМрджреЗ рдХреА рдирд┐рд╖реНрдард╛ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред
рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ check
рдЬреИрд╕реЗ рдирдП рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдореМрдЬреВрджрд╛ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╛рдЗрди рдХреЛ рдЕрд╕рдВрдЧрдд рдмрдирд╛ рджреЗрдЧрд╛ред рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╡рд╛рдХреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдирдпрд╛ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдирд╛ рднрд╛рд╖рд╛ рдХреА рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рддреБрдЪреНрдЫ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИред
рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдореЗрдВ try(f())
рдмрдЬрд╛рдп try(f())
рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ (рдЫреЛрдЯреЗ) рдореВрд▓реНрдп рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдореМрдЬреВрджрд╛ рдкрд╛рд░реНрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдЕрдиреБрдХреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ: рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдлрдВрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдпрд╛ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП try
рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ try
рдХреЙрд▓ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рддреБрдЪреНрдЫ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдХреЛрд╖реНрдардХ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВред рдХрдИ try
рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, рдХреЛрд╖реНрдардХ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреА рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдХреЗ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ:
info := try(try(os.Open(file)).Stat())
try
, : try
, .. try
(receiver) .Stat
( os.Open
).
try
, : os.Open(file)
.. try
( , try
os
, , try
try
).
, .. .
рдирд┐рд╖реНрдХрд░реНрд╖
. , . defer
, .
Go - , . , Go append
. append
, . , . , try
.
, , Go : panic
recover
. error
try
.
, try
, , тАФ тАФ , . Go:
, , . if
-.
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
:
- Go.
try
. , . .go/types
try
. .gccgo
. ( , ).- .
- , . , . .
Robert Griesemer go/types
, () cmd/compile
. , Go 1.14, 1 2019.
, Ian Lance Taylor gccgo
, .
"Go 2, !" , .
1 , , , Go 1.14 .
CopyFile
:
func CopyFile(src, dst string) (err error) { defer func() { if err != nil { err = fmt.Errorf("copy %s %s: %v", src, dst, err) } }() r := try(os.Open(src)) defer r.Close() w := try(os.Create(dst)) defer func() { w.Close() if err != nil { os.Remove(dst)
, " ", defer
:
defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
( defer
-), defer
, .
printSum
func printSum(a, b string) error { x := try(strconv.Atoi(a)) y := try(strconv.Atoi(b)) fmt.Println("result:", x + y) return nil }
:
func printSum(a, b string) error { fmt.Println( "result:", try(strconv.Atoi(a)) + try(strconv.Atoi(b)), ) return nil }
main
:
func localMain() error { hex := try(ioutil.ReadAll(os.Stdin)) data := try(parseHexdump(string(hex))) try(os.Stdout.Write(data)) return nil } func main() { if err := localMain(); err != nil { log.Fatal(err) } }
- try
, :
n, err := src.Read(buf) if err == io.EOF { break } try(err)
, .
: ?
: check
handle
, . , handle
defer
, handle
.
: try ?
: try
Go . - , . , . , " ". try
, .. .
: try
try?
: , check
, must
do
. try
, . try
check
(, ), - . . must
; try
тАФ . , Rust Swift try
( ). .
: ?
Rust?
: Go ; , Go ( ; - ). , ?
, . , , , (package, interface, if, append, recover, ...), , (struct, var, func, int, len, image, ..). Rust ?
try
тАФ Go, , ( ) . , ?
. , , (, ..) . . , .
: ( error) , defer , go doc. ?
: go doc
, - ( _
) , . , func f() (_ A, _ B, err error)
go doc
func f() (A, B, error)
. , , , . , , . , , , -, (deferred) . Jonathan Geddes try()
.
: defer ?
: defer
. , , defer "" . . CL 171758 , defer 30%.
: ?
: , . , ( , ), . defer
, . defer
- https://golang.org/issue/29934 ( Go 2), .
: , try, error. , ?
: error
( ) , , nil
. try
. ( , . - ).
: Go , try ?
: try
, try
. super return
-, try
Go
. try
. .
: try , . ?
: try
; , . try
( ), . , if
.
: , . try, defer . ?
: , . .
: try
( catch
)?
: try
тАФ ("") , , ( ) . try
; . . "" . , . , try
тАФ . , , throw
try-catch
Go. , (, ), ( ) , . "" try-catch
, . , , . Go . panic
, .