1.13 рдЧреЛ рдореЗрдВ рдХреАрдбрд╝реЗ рд╕реЗ рдирд┐рдкрдЯрдирд╛


рдкрд┐рдЫрд▓реЗ рдПрдХ рджрд╢рдХ рдореЗрдВ, рд╣рдордиреЗ рдЗрд╕ рддрдереНрдп рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рджреЛрд╣рди рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЧреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдорд░реНрдерди рдерд╛: рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдБред errors.New рдФрд░ fmt.Errorf рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ - рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЧреЛ-рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрд┐рд╕реА рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ Error рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:

 type QueryError struct { Query string Err error } func (e *QueryError) Error() string { return e.Query + ": " + e.Err.Error() } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕реЗ рд▓реЗрдХрд░ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рд╕рд░реНрд╡рд░ рдкрддреЗ рддрдХ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВред рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВ, рдЕрдХреНрд╕рд░ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд╣реИрдВред

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

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

1.13 рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ


рддреНрд░реБрдЯрд┐ рдЕрдиреБрд╕рдВрдзрд╛рди


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

 if err != nil { // something went wrong } 

рдХрднреА-рдХрднреА рд╣рдо рдирд┐рдпрдВрддреНрд░рдг рдореВрд▓реНрдп рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИред

 var ErrNotFound = errors.New("not found") if err == ErrNotFound { // something wasn't found } 

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

 type NotFoundError struct { Name string } func (e *NotFoundError) Error() string { return e.Name + ": not found" } if e, ok := err.(*NotFoundError); ok { // e.Name wasn't found } 

рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛


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

 if err != nil { return fmt.Errorf("decompress %v: %v", name, err) } 

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

 type QueryError struct { Query string Err error } 

рдХрд╛рд░реНрдпрдХреНрд░рдо *QueryError рдЕрдВрджрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрднреА-рдХрднреА рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдЕрд▓рд┐рдЦрд┐рдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

 if e, ok := err.(*QueryError); ok && e.Err == ErrPermission { // query failed because of a permission problem } 

рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ os.PathError рдкреНрд░рдХрд╛рд░ рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред

1.13 рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ


рдЕрдирд╡рд╛рдк рд╡рд┐рдзрд┐


1.13 рдореЗрдВ, errors рдФрд░ fmt рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрдХреБрд▓ fmt рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдореНрдореЗрд▓рди рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ: рдПрдХ рддреНрд░реБрдЯрд┐ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рд╣реИ, рд╡рд╣ Unwrap рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ e1.Unwrap() рд░рд┐рдЯрд░реНрди e2 , рддреЛ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ e1 e2 рдкреИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк e2 рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП e1 рдХреЛ рдЕрдирдкреИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рдЕрдзрд┐рд╡реЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк QueryError рдкрджреНрдзрддрд┐ рдХреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд QueryError рдкреНрд░рдХрд╛рд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ:

 func (e *QueryError) Unwrap() error { return e.Err } 

рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ Unwrap рд╡рд┐рдзрд┐ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдмрд╛рд░-рдмрд╛рд░ рдЕрдирдкреИрдХрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХреНрд░рдо, рд╣рдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ ред

Is рдФрд░ As рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ


1.13 рдореЗрдВ, errors рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП errors рдкреИрдХреЗрдЬ рдореЗрдВ рджреЛ рдирдП рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: Is рдФрд░ As ред

errors.Is рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред

 // Similar to: // if err == ErrNotFound { тАж } if errors.Is(err, ErrNotFound) { // something wasn't found } 

As рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИред

 // Similar to: // if e, ok := err.(*QueryError); ok { тАж } var e *QueryError if errors.As(err, &e) { // err is a *QueryError, and e is set to the error's value } 

рд╕рд░рд▓рддрдо рд╕реНрдерд┐рддрд┐ рдореЗрдВ, errors.Is ред errors.Is рдлрдВрдХреНрд╢рди рдПрдХ рдХрдВрдЯреНрд░реЛрд▓ рдПрд░рд░ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрд░рд░ред errors.As рдлрдВрдХреНрд╢рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреИрдХреНрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпреЗ рдлрд╝рдВрдХреНрд╢рди рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВред рдореВрд▓ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ QueryError рдХреЗ QueryError рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ:

 if e, ok := err.(*QueryError); ok && e.Err == ErrPermission { // query failed because of a permission problem } 

errors.Is рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ errors.Is рдлрд╝рдВрдХреНрд╢рди, errors.Is рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 if errors.Is(err, ErrPermission) { // err, or some error that it wraps, is a permission problem } 

errors рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдирдпрд╛ Unwrap рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЗ Unwrap рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЛ Unwrap рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ nil рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ errors.Is рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ errors.Is рдпрд╛ errors.As рдХреЗ рдмрд╛рдж рд╕реЗ, рд╡реЗ рдЖрдкрдХреЛ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

% W рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬрд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП fmt.Errorf рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рд╣реИред

 if err != nil { return fmt.Errorf("decompress %v: %v", name, err) } 

1.13 рдореЗрдВ, fmt.Errorf рдлрд╝рдВрдХреНрд╢рди рдирдП %w рдХрдорд╛рдВрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ fmt.Errorf рджреНрд╡рд╛рд░рд╛ fmt.Errorf рдЧрдИ рддреНрд░реБрдЯрд┐ рдореЗрдВ fmt.Errorf рдкрджреНрдзрддрд┐ рд╣реЛрдЧреА рдЬреЛ %w рддрд░реНрдХ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, %w , %v рд╕рдорд╛рди рд╣реИред

 if err != nil { // Return an error which unwraps to err. return fmt.Errorf("decompress %v: %w", name, err) } 

%w рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреЛ errors.Is рдпрд╣ errors.Is рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИред errors.Is рдФрд░ errors.As ред

 err := fmt.Errorf("access denied: %w", ErrPermission) ... if errors.Is(err, ErrPermission) ... 

рдХрдм рдкреИрдХ рдХрд░реЗрдВ?


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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ io.Reader рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ io.Reader рд╕реЗ рдПрдХ рдЬрдЯрд┐рд▓ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ io.Reader ред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдЙрд╕ рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реБрдЖ рдерд╛ред рдпрджрд┐ io.Reader рд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдВрдХрд┐ рдХреЙрд▓рд░ рдХреЛ io.Reader рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдПрдХ рдЕрдиреНрдп рдорд╛рдорд▓рд╛: рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХрдИ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдПрдХ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЗрди рдХреЙрд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рддреЛ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ pkg рдкреИрдХреЗрдЬ рд╕реЗ LookupUser рдлрд╝рдВрдХреНрд╢рди Go database/sql рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ sql.ErrNoRows рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк fmt.Errorf("accessing DB: %v", err) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рддреНрд░реБрдЯрд┐ fmt.Errorf("accessing DB: %v", err) , рддреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЕрдВрджрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ sql.ErrNoRows рдвреВрдВрдв sql.ErrNoRows ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдлрд╝рдВрдХреНрд╢рди fmt.Errorf("accessing DB: %w", err) рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ fmt.Errorf("accessing DB: %w", err) рд▓рд┐рдЦ рд╕рдХрддреА рд╣реИ:

 err := pkg.LookupUser(...) if errors.Is(err, sql.ErrNoRows) тАж 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдореЗрд╢рд╛ sql.ErrNoRows рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЕрд▓рдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реБрдП рднреА рдирд╣реАрдВ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдкреИрдХреЗрдЬрд┐рдВрдЧ рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдкреАрдЖрдИ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдкреИрдХреЗрдЬ рди рдХрд░реЗрдВред

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

рдИрдЬрд╝ рдПрдВрдб рдЕрд╕ рдореЗрдердбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдХрд░рдирд╛


errors.Is рдлрд╝рдВрдХреНрд╢рди рд▓рдХреНрд╖реНрдп рдорд╛рди рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рддреНрд░реБрдЯрд┐ рдЗрд╕ рдорд╛рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдпрджрд┐ рд╡реЗ рд╕рдордХрдХреНрд╖ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рдХреНрд╖реНрдп рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреА рд╣реИред

Upspin рдкреИрдХреЗрдЬ рдХреЗ рдХрд╛рд░рдг рд╣реБрдИ рддреНрд░реБрдЯрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдиреЙрдирдЬрд░реЛ рдлрд╝реАрд▓реНрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИ:

 type Error struct { Path string User string } func (e *Error) Is(target error) bool { t, ok := target.(*Error) if !ok { return false } return (e.Path == t.Path || t.Path == "") && (e.User == t.User || t.User == "") } if errors.Is(err, &Error{User: "someuser"}) { // err's User field is "someuser". } 

errors.As ред errors.As рд╕рдорд╛рд░реЛрд╣ рднреА рд╡рд┐рдзрд┐ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╣реЛред

рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдкреИрдХреЗрдЬ рдПрдкреАрдЖрдИ


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

рд╕рдмрд╕реЗ рд╕рд░рд▓ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдСрдкрд░реЗрд╢рди рд╕рдлрд▓ рд░рд╣рд╛ рдерд╛, рдХреНрд░рдорд╢рдГ, рдореВрд▓реНрдп рд╢реВрдиреНрдп рдпрд╛ рдЧреИрд░-рд╢реВрдиреНрдпред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

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

 var ErrNotFound = errors.New("not found") // FetchItem returns the named item. // // If no item with the name exists, FetchItem returns an error // wrapping ErrNotFound. func FetchItem(name string) (*Item, error) { if itemNotFound(name) { return nil, fmt.Errorf("%q: %w", name, ErrNotFound) } // ... } 

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

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

 f, err := os.Open(filename) if err != nil { // The *os.PathError returned by os.Open is an internal detail. // To avoid exposing it to the caller, repackage it as a new // error with the same text. We use the %v formatting verb, since // %w would permit the caller to unwrap the original *os.PathError. return fmt.Errorf("%v", err) } 

рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдкреИрдХреНрдб рд╕рд┐рдЧреНрдирд▓ рдорд╛рди рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕реАрдзреЗ рдореВрд▓ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рди рдХрд░реЗрдВред

 var ErrPermission = errors.New("permission denied") // DoSomething returns an error wrapping ErrPermission if the user // does not have permission to do something. func DoSomething() { if !userHasPermission() { // If we return ErrPermission directly, callers might come // to depend on the exact error value, writing code like this: // // if err := pkg.DoSomething(); err == pkg.ErrPermission { тАж } // // This will cause problems if we want to add additional // context to the error in the future. To avoid this, we // return an error wrapping the sentinel so that users must // always unwrap it: // // if err := pkg.DoSomething(); errors.Is(err, pkg.ErrPermission) { ... } return fmt.Errorf("%w", ErrPermission) } // ... } 

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


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

рдЬреИрд╕рд╛ рдХрд┐ рд░реЛрд╕ рдХреЙрдХреНрд╕ рдиреЗ рдЧреЛрдлрд░рдХреЙрди 2019 рдореЗрдВ рдЕрдкрдиреЗ рднрд╛рд╖рдг рдореЗрдВ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдЧреЛ 2 рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╣рдо рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдЬ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдм, рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рднреЗрдЬрдирд╛, рд╣рдордиреЗ рдирдП рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

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


All Articles