<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] > [Go語言(golang)新發布的1.13中的Error Wrapping深度分析 ](https://www.flysnow.org/2019/09/06/go1.13-error-wrapping.html) ### 常用錯誤類型 ``` os.ErrInvalid os.ErrPermission os.ErrExist os.ErrNotExist os.ErrClosed os.ErrNoDeadline // 判斷類型 os.IsExist(err) os.IsNotExist(err) os.IsPermission(err) os.IsTimeout(err) os.IsTimeout(err) //使用 _, err := os.Open("/no/such/file") fmt.Println(os.IsNotExist(err)) // "true" ``` ## 更新 error (1.13) ### error 的多層嵌套 ``` e := fmt.Errorf("第一層錯誤") //等于 errors.New("原始錯誤e") e = fmt.Errorf("第二層錯誤%w", e) ``` ### Unwrap 它的功能就是為了獲得被嵌套的error ``` e := fmt.Errorf("第一層錯誤") //等于 errors.New("原始錯誤e") e = fmt.Errorf("第二層錯誤%w", e) e = fmt.Errorf("第三層錯誤%w", e) fmt.Println(e.Error()) // 第三層錯誤第二層錯誤第一層錯誤 fmt.Println(errors.Unwrap(e)) // 第二層錯誤第一層錯誤 fmt.Println(errors.Unwrap(errors.Unwrap(e))) //第一層錯誤 ``` ### Is 判斷是否是同一個 error 判斷是否是同一個 error,必須是同一個error 產生 ``` e := errors.New("123") e1 := e e2 := e fmt.Println(errors.Is(e1, e2)) //true e1 := errors.New("123") e2 := errors.New("123") fmt.Println(errors.Is(e1, e2))//false e := func() error { return errors.New("123") } e1 := e() e2 := e() fmt.Println(errors.Is(e1, e2)) //false ``` ### As 斷言 從功能上來看,`As`所做的就是遍歷err嵌套鏈,從里面找到類型符合的error ``` var perr *os.PathError if errors.As(err, &perr) { fmt.Println(perr.Path) } ``` ## 舊工程遷移 ### 直接返回 ``` return err // or return fmt.Errorf("more info: %v", err) //遷移 return fmt.Errorf("more info: %w", err) ``` ### == 判斷 ``` if err == os.ErrExist //遷移 if errors.Is(err, os.ErrExist) ``` ### 斷言 ``` if perr, ok := err.(*os.PathError); ok { fmt.Println(perr.Path) } //遷移 var perr *os.PathError if errors.As(err, &perr) { fmt.Println(perr.Path) } ``` ## 自定義error 結構體 不使用嵌套 ``` type MyError struct { When time.Time error string } // 使用 Error() 的接口都視為 error func (e MyError) Error() string { return fmt.Sprintf("%v: %v", e.When.Format(time.RFC3339), e.error) } func NewMyError(err string) error { return MyError{ time.Now(), err, } } func main() { err := NewMyError("this is test") fmt.Printf("%+v\n", err) // 2020-12-24T15:38:43+08:00: this is test } ``` 使用 嵌套 ``` type MyError struct { err error msg string } func (e *MyError) Error() string { return e.err.Error() + e.msg } //遷移 func (e *MyError) Unwrap() error { return e.err } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看