рдПрд░рд░рдПрдХреНрд╕ - рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп

Errorx рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ


рдПрд░рд░рдПрдХреНрд╕ рдЧреЛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдпрд╣ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рддрдВрддреНрд░ рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред


рдЫрд╡рд┐


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


рдорд┐рд╕реНрдЯреЗрдХ рдЗрди рдЧреЛ


рдПрд░рд░рдПрдХреНрд╕рдПрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛рдиреА рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдВрдд рдореЗрдВ, рдмрдЧреНрд╕ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?


type error interface { Error() string } 

рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд╣реИ рдирд╛? рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдХреНрд╕рд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡рд┐рд╡рд░рдгред рдРрд╕реА рдЕрддрд┐рд╕реВрдХреНрд╖реНрдорд╡рд╛рдж рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЧрд▓рддреА рдЬрд░реВрд░реА рдХреБрдЫ "рдЕрд╕рд╛рдзрд╛рд░рдг" рдирд╣реАрдВ рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпрд╛рдВред рдирдпрд╛ () рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ:


 func New(text string) error { return &errorString{text} } 

рдпрджрд┐ рд╣рдо рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ, рддреЛ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдХреНрдпрд╛ рд╣реИ?


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


рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?


рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдЧреЛ рдореЗрдВ рдмрдЧ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреА рд╣реИрдВ, рдЬреИрд╕реЗ рд╡реЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рднреА рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕реЗ рд╣реА рдкреНрд░рдгрд╛рд▓реА рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдмрдврд╝рддреА рд╣реИ, рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрддреА рд╣реИрдВ рдЬреЛ рдЙрдЪреНрдЪ рдЙрдореНрдореАрджреЛрдВ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рднреА рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИрдВред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЪрд┐рддреНрд░рдг рдЖрдкрдХреА рд╕реЗрд╡рд╛ рдХреЗ рд▓реЙрдЧ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд░реЗрдЦрд╛ рд╣реИ:


Error: duplicate key


рдпрд╣рд╛рдВ, рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ: рдпрджрд┐ рдЖрдк рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрдбрд╝реА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдпрд╣ рд╕рдордЭрдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖ, рдХреЗрд╡рд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрджреЗрд╢ рд╕реЗред рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд╕рдВрджрд░реНрдн рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдЧрд▓рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдХреНрд╕рд░ рдЗрд╕реЗ рдЙрдкреЗрдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реЛрддрд╛ рд╣реИред рдирд┐рдпрдВрддреНрд░рдг рдЧреНрд░рд╛рдл рдХреА "рд╕рдХрд╛рд░рд╛рддреНрдордХ" рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХреЛрдб рд╣рдореЗрд╢рд╛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпрд╛ рдмрд╛рд╣рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╡реНрдпрд╡рдзрд╛рди рд╕реЗ рдЬреБрдбрд╝реЗ "рдирдХрд╛рд░рд╛рддреНрдордХ" рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдмреЗрд╣рддрд░ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рддрдиреА рдмрд╛рд░ if err != nil {return err} рдордВрддреНрд░ рдЧрд▓рдд рд╣реЛ if err != nil {return err} рдЧреЛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдУрд╡рд░рд╕рд╛рдЗрдЯ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИред


рдПрдХ рдЫреЛрдЯреЗ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 func (m *Manager) ApplyToUsers(action func(User) (*Data, error), ids []UserID) error { users, err := m.LoadUsers(ids) if err != nil { return err } var actionData []*Data for _, user := range users { data, err := action(user) if err != nil { return err } ok, err := m.validateData(data) if err != nil { return nil } if !ok { log.Error("Validation failed for %v", data) continue } actionData = append(actionData, data) } return m.Apply(actionData) } 

рдЖрдкрдиреЗ рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдЗрд╕ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рджреЗрдЦреА? рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╢рд╛рдпрдж рдХрд┐рд╕реА рднреА рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ред рд╕рдВрдХреЗрдд: if err != nil { return nil } рдЧрд▓рдд рд╣реИ рддреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ if err != nil { return nil } ред


рдпрджрд┐ рд╣рдо рд▓реЙрдЧ рдореЗрдВ рдПрдХ рд╕реНрд▓реЗрдЯ рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рд░ рдХреЛрдИ рднреА рд╣реБрдЖред рдЬрд┐рд╕ рд╕рдордп рд╕рдорд╕реНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЙрд╕ рд╕рдордп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдкреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЙрдЧ рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреА рдЦреЛрдЬ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдкрдХреНрд╖ рдХреЛ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреВрд░ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреЛрдб рдореЗрдВ рдЫреЛрдЯреЗ рд╣реИрдВ рдФрд░ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдФрд░ рджрд░реНрджрдирд╛рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред


рдорд╛рди рд▓реЗрдВ рдХрд┐ рдПрдХ рдХрдбрд╝рд╡рд╛ рдЕрдиреБрднрд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЙрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рднреЛрд▓рд╛ рддрд░реАрдХрд╛ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


 func InsertUser(u *User) error { err := usersTable.Insert(u) if err != nil { return errors.New(fmt.Sprintf("failed to insert user %s: %v", u.Name, err) } return nil } 

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


рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЦрддрд░рдирд╛рдХ рдХреНрдпреЛрдВ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдореЗрдВ рд╕рдорд╛рди рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:


 var ErrDuplicateKey = errors.New("duplicate key") func (t *Table) Insert(entity interface{}) error { // returns ErrDuplicateKey if a unique constraint is violated by insert } func IsDuplicateKeyError(err error) bool { return err == ErrDuplicateKey } 

рдЕрдм IsDuplicateKeyError() рдЪреЗрдХ рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕ рд╕рдордп рдЬрдм рд╣рдордиреЗ рдЕрдкрдиреЗ рдкрд╛рда рдХреЛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛, рддрдм рд╣рдорд╛рд░рд╛ рдЗрд╕рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛ред рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕ рдЪреЗрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛:


 func RegisterUser(u *User) error { err := InsertUser(u) if db.IsDuplicateKeyError(err) { // find existing user, handle conflict } else { return err } } 

рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, Cause() error рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рддреЛ рд╣рдо рднреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░реЗрдВрдЧреЗред


  1. рдЕрдм рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд╣реА рдХрд╛рд░рдг Cause()
  2. рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЛ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд▓рд┐рдЦреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдмреЗрдХрд╛рд░ рд░рд╣реЗрдВрдЧреЗ
  3. рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддреНрд░реБрдЯрд┐ (рдпрд╛ рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ) рдХреЗ рддрддреНрдХрд╛рд▓ рдХрд╛рд░рдг Cause() рд╡рд╛рдкрд╕ Cause() рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧреИрд░-рд╢реВрдиреНрдп рдореВрд▓ рдХрд╛рд░рдг рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛; рдорд╛рдирдХ рд╕рд╛рдзрдиреЛрдВ рдХреА рдХрдореА рдпрд╛ рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рдЕрдиреБрдмрдВрдз рдмрд╣реБрдд рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рдХрд╛ рдЦрддрд░рд╛ рд╣реИ

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдЖрдВрд╢рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рддреНрд░реБрдЯрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ, рд╣рдорд╛рд░рд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛ 2 рдореЗрдВ рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ - рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред


Errorx


рдиреАрдЪреЗ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдПрд░рд░рдПрдХреНрд╕ рдХреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рддрд╣рдд рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред


  • рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирд┐рджрд╛рди рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдлрд┐рд░ рднреА, рд╡реЗ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрде рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡реЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрдЬрд╛рдирдХрд╛рд░реА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
  • рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ред рдирд┐рджрд╛рди рдХреА рдкреВрд░реНрдгрддрд╛ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА (рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ) рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рдареАрдХ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрдеред рддреНрд░реБрдЯрд┐ рдХреЗ рдЕрд░реНрде рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░, рд╡рд┐рд╡рд┐рдзрддрд╛, рдЧреБрдгред
  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрд╕рд╛рдиреАред рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдкрд╛рд╕рд┐рдВрдЧ рдПрд░рд░ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рд╕рд╛рджрдЧреАред рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХреЛрдб рдЕрдХреНрд╕рд░ рдФрд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд░рд▓ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рдмрдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  • рдХрдо рдЬреНрдпрд╛рджрд╛ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ (рдЬреЛ, рд╢рд╛рдпрдж, рдХреЛрдИ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛ рдФрд░ рдПрдХрд░реВрдкрддрд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
  • рддреНрд░реБрдЯрд┐ рд╢рдмреНрджрд╛рд░реНрде рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдЕрд▓рдЧ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рдЖрдкрдХреЛ рдЗрд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдпрд╛ рдЗрд╕реЗ рдХрдо рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдХрдо рдирд╛рдЬреБрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред
  • рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреАрдбрд╝реЗ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реИрдВред рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЕрдкреНрд░рднреЗрджреНрдп рд╣реИрдВ, рдмреЗрд╣рддрд░ рд╣реИред рдПрдкреАрдЖрдИ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдирд╛ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рджреЛрд╖ рд╣реИ рдЬрд┐рд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдХрдард┐рди рдкреНрд░рд╢реНрди рд╡рд┐рд▓реБрдкреНрддрддрд╛ рдерд╛: рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ, рдпрд╛ рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА рд╣рд░ рдЪреАрдЬрд╝ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ? рд╣рдордиреЗ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, errorx рдПрдХ рдмрд╣реБрдд рд╣реА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ - рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдкреЗрдпрд░ рдкрд╛рд░реНрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рджреВрд╕рд░реЗ, рд╕рд╛рджрдЧреА рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ: рдЪреВрдВрдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдХрдо рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛред рдЕрднреНрдпрд╛рд╕ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдРрд╕реЗ рд╕рднреА рдХреЛрдб рд╕рдорд╛рди рджрд┐рдЦреЗрдВ рдФрд░ рдХрд╛рдо рдХрд░реЗрдВред


рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЯреАрдПрд▓; рдбреАрдЖрд░:


  • рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдирд┐рд░реНрдорд╛рдг рд╕реНрдерд╛рди
  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
  • рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
  • рдпрджрд┐ рдЖрдк рдХреЙрд▓рд░ рд╕реЗ рдореВрд▓ рдХрд╛рд░рдг рдЫрд┐рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рджреГрд╢реНрдпрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдЯрд╛рдЗрдк рдХрд░реЗрдВ
  • рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рддрдВрддреНрд░ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ (рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо, рд▓рдХреНрд╖рдг)
  • рдЧрддрд┐рд╢реАрд▓ рдЧреБрдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рддреНрд░реБрдЯрд┐ рдЕрдиреБрдХреВрд▓рди
  • рдорд╛рдирдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░
  • рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛

рдкрд░рд┐рдЪрдп


рдпрджрд┐ рд╣рдо рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:


 var ( DBErrors = errorx.NewNamespace("db") ErrDuplicateKey = DBErrors.NewType("duplicate_key") ) func (t *Table) Insert(entity interface{}) error { // ... return ErrDuplicateKey.New("violated constraint %s", details) } func IsDuplicateKeyError(err error) bool { return errorx.IsOfType(err, ErrDuplicateKey) } 

 func InsertUser(u *User) error { err := usersTable.Insert(u) if err != nil { return errorx.Decorate(err, "failed to insert user %s", u.Name) } return nil } 

IsDuplicateKeyError() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХреЙрд▓рд░ рдХреЛрдб рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИ?


  • ErrDuplicateKey рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрди рдЧрдпрд╛, рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ; рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИ, рд╕рдЯреАрдХ рд╕рдорд╛рдирддрд╛ рдкрд░ рдХреЛрдИ рдирд╛рдЬреБрдХ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИ
  • рдбреЗрдЯрд╛рдмреЗрд╕ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рд╕реНрдерд╛рди рд╣реИ; рдЗрд╕рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреА, рдФрд░ рдРрд╕рд╛ рд╕рдореВрд╣ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рддреНрд░реБрдЯрд┐ рдбрд╛рд▓реЗрдВ:
    • рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ; рдпрд╣, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рд╡рд╣реА рддреНрд░реБрдЯрд┐ рдЙрджрд╛рд╣рд░рдг рд╣рд░ рдмрд╛рд░ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдкрд╣рд▓реЗ IsDuplicateKeyError() рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛
    • рдпреЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд▓реЗ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЙрдкрдпреЛрдЧреА рд╣реИ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рднреА рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ
  • InsertUser() рддреНрд░реБрдЯрд┐ рдкрд╛рда рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рдж рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • IsDuplicateKeyError() рдЕрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рди рддреЛ рддреНрд░реБрдЯрд┐ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдХрд░, рдФрд░ рди рд╣реА рдХрдИ рдкрд░рддреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ()

рдпрд╣ рд╣рдореЗрд╢рд╛ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдпреЛрдЬрдирд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:


  • рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдЕрджреНрд╡рд┐рддреАрдп рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ: рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реИ, рддреЛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрд╕реА рдХреЛ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ; рдпреЗ рддрдерд╛рдХрдерд┐рдд рдкреНрд░рд╣рд░реА рддреНрд░реБрдЯрд┐ рд╣реИрдВ, рдФрд░ рд╣рдо рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдкрд░ рдмрдЪрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
  • errorx.IsOfType(err, ErrDuplicateKey) рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред errorx.IsOfType(err, ErrDuplicateKey) рд╕реНрдЯреЙрдк рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдореВрд▓ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ errorx.IsOfType(err, ErrDuplicateKey) рдЖрдБрдЦреЛрдВ рд╕реЗ рдЫрд┐рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
  • рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрд╡рдпрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВ

рдЧреЛрдбреЛрдХ рдореЗрдВ рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдиреАрдЪреЗ рд╣рдо рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдереЛрдбрд╝реА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рджреИрдирд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред


рдкреНрд░рдХрд╛рд░


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


 AuthErrors = errorx.NewNamespace("auth") ErrInvalidToken = AuthErrors.NewType("invalid_token") 

 return ErrInvalidToken.NewWithNoMessage() 

рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ auth.invalid_token . auth.invalid_token рд╣реЛрдЧрд╛ред рддреНрд░реБрдЯрд┐ рдШреЛрд╖рдгрд╛ рдЕрд▓рдЧ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:


 ErrInvalidToken = AuthErrors.NewType("invalid_token").ApplyModifiers(errorx.TypeModifierOmitStackTrace) 

рдЗрд╕ рдЕрд╡рддрд╛рд░ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╕рдВрдЧреНрд░рд╣ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдореЗрдВ рдорд╛рд░реНрдХрд░ рд╢рдмреНрджрд╛рд░реНрде рд╣реИ: рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд▓реЙрдЧ рдореЗрдВ рдПрдХ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд░рдореНрдордд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред


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


рддреНрд░реБрдЯрд┐ рдирд┐рд░реНрдорд╛рдг


 return MyType.New("fail") 

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


 return errorx.IllegalArgument.New("negative value %d", value) 

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЙрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреИрджрд╛ рд╣реЛ, рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛред рдЧреЛ рдореЗрдВ рдпрд╣ рдмрд┐рдирд╛ рдХрд╛рд░рдг рдХреЗ рдирд╣реАрдВ рд╣реИ рдХрд┐ рджреЛ рдмрд╛рд░ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмреБрд░рд╛ рд░реВрдк рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓рд┐рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдКрдкрд░ рдЙрдЪреНрдЪрддрд░ рд▓реМрдЯрд╛рдПрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЗрд╕реЗ рджреВрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:


 return errorx.Decorate(err, "failed to upload '%s' to '%s'", filename, location) 

рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдкрд╛рда рд▓реЙрдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛ред


рдХрднреА-рдХрднреА рд╡рд┐рдкрд░реАрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ: рддреНрд░реБрдЯрд┐ рдХреА рдкреНрд░рдХреГрддрд┐ рдЬреЛ рднреА рд╣реЛ, рдкреИрдХреЗрдЬ рдХреЗ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЙрд╕реЗ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛, рддреЛ рд╡рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдПрдХ рдирд╛рдЬреБрдХ рдирд┐рд░реНрднрд░рддрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


 return service.ErrBadRequest.Wrap(err, "failed to load user data") 

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


рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЯреНрд░рд┐рдХ рдЬреЛ рдЖрдкрдХреЛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрд╕ рддрд░рд╣ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ:


 return errorx.EnhanceStackTrace(err, "operation fail") 

рдпрджрд┐ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдЧреЛрд░рдЖрдЙрдЯ рд╕реЗ рдЖрдИ рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рджреЛрдиреЛрдВ рдЧреЛрд░рдЖрдЙрдЯреНрд╕ рдХрд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЗрд╕ рддрд░рд╣ рдХреА рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣реИ: рдпрд╣ рдорд╛рдорд▓рд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рджреБрд░реНрд▓рдн рд╣реИ, рдФрд░ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдЬреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реИрдк рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрдЧрд╛, рдЬрд╣рд╛рдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИред


рдЧреЛрдбреЛрдХ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдФрд░ рдбреЗрдХреЛрд░реЗрдЯрдордиреА рдЬреИрд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рднреА рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрдиреЗ рдкрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда:


 log.Error("Error: %+v", err) 

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд┐рд╕реНрдЯрдо рд▓реЗрдпрд░ рдкрд░ рд▓реЙрдЧ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬрд┐рддрдиреА рдХрдо рддреНрд░реБрдЯрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрддрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХрднреА-рдХрднреА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 if errorx.IsOfType(err, MyType) { /* handle */ } 

рдпрд╣ рдЬрд╛рдБрдЪ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ MyType рдФрд░ рдЙрд╕рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд░ рд╕рдлрд▓ рд╣реЛрдЧреА, рдФрд░ рдпрд╣ errorx.Decorate() рд▓рд┐рдП рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реИред рдпрд╣рд╛рдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреИрдХреЗрдЬ рдХреЗ рднреАрддрд░ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд╣рд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рдкрд░ рдЕрдкреНрд░рд┐рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдРрд╕реА рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реНрдерд┐рд░ рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рд╣рдо рдЗрд╕ рдЪреЗрдХ рдХреЛ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВред


рдХреНрд▓рд╛рд╕рд┐рдХ рдЧреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рдХрд╛рд╕реНрдЯ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХреЗрддрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред Errorx рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп Trait рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


 func IsTemporary(err error) bool { return HasTrait(err, Temporary()) } 

рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдорд╛рдирдХ рд╕рдВрдкрддреНрддрд┐ Temporary , рдЕрд░реНрдерд╛рддред рдЪрд╛рд╣реЗ рд╡рд╣ рдЕрд╕реНрдерд╛рдпреА рд╣реЛред рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реНрд░реЛрдд рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдмрд╛рд╣рд░реА рдПрдкреАрдЖрдИ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрдХреЗрдд рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред


 return errorx.IgnoreWithTrait(err, errorx.NotFound()) 

рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдкреНрд░рдЪреБрд░рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рднреА рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬрд┐рд╕рдХрд╛ рд╣рдо рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:


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

рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд╣рд░


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


рд╕рдВрдЧрддрддрд╛ рдХреЗ рдореБрджреНрджреЗ


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рдо рдЗрд╕ рдмрд╛рдд рд╕реЗ рдмрд╣реБрдд рдкреНрд░рд╕рдиреНрди рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ errorx рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рд╣рдо рдЬреВрдо рдореЗрдВ рдПрд░рд░рдПрдХреНрд╕рдПрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧреЛ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЗрд╕ рдкреВрд░реЗ рд╕реЗрдЯ рдХреЛ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рддреНрд░реБрдЯрд┐, рдЬрд┐рд╕рдХреЗ рд╕реНрд░реЛрдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд╣реИрдВ, рдХреЛ рд╡рд┐рджреЗрд╢реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдЪреАрдЬреЗрдВ рдХреА рдЧрдИ рд╣реИрдВ рддрд╛рдХрд┐ рдЕрдиреНрдп рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рди рд╣реЛред


рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП '%+v' рдкреНрд░рд╛рд░реВрдк '%+v' рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЧреЛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрдереНрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рдЧреЛ 2 рдХреЗ рдорд╕реМрджреЗ рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


Cause() error errorx , , , Causer, errorx Wrap().



, Go 2, . .


, errorx Go 1. , Go 2, . , , errorx.


Check-handle , errorx , a Unwrap() error Wrap() errorx (.. , , Wrap ), . , , .


design draft Go 2, errorx.Is() errorx.As() , errors .


рдирд┐рд╖реНрдХрд░реНрд╖


, , , - , . , API : , , . 1.0 , Joom. , - .


: https://github.com/joomcode/errorx


, !


рдЫрд╡рд┐

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


All Articles