當前位置:遊戲中心平台 - 遊戲盒子 - 圍棋產生錯誤的方式有這麽多,妳真的了解它們各自的應用場景嗎?

圍棋產生錯誤的方式有這麽多,妳真的了解它們各自的應用場景嗎?

在Go中,error是壹種內置的數據類型。在Go中定義為接口,定義如下:

所以接口只有壹個返回字符串的錯誤函數,所有類型只要實現了這個函數都會創建壹個錯誤類型。

產生錯誤的方式包括錯誤。新的,fmt。Errorf,以及用戶定義的錯誤接口的類型。

2.1是由錯誤創建的。新方法。

這種方法產生的錯誤通常是可預測的錯誤。簡單來說,調用者可以通過這個錯誤消息清楚地知道哪裏出錯了,不需要添加其他上下文信息,我們將在下面的例子中詳細解釋。

查看新方法的實現,我們可以看到它實際上返回了壹個ErrorString結構,該結構包含壹個String屬性並實現了error方法。代碼如下:

錯誤。新使用場景1:

通過錯誤創建局部變量或匿名變量。新函數,並且不判斷調用函數中的值或類型,而只打印或記錄錯誤日誌的場景。

使用示例1:

以下代碼摘自源代碼/src/net//src/net//http/transport . go當請求體中的url地址為nil時,返回的錯誤為“http: nil Request。URL”,這意味著請求中的URL字段為零。以及當頭為nil時返回的錯誤:“http: nilrequest。Header”,表示請求正文中的頭字段為零。

錯誤。新的使用場景2:

分配由錯誤創建的錯誤。壹個新的全局變量,我們稱之為哨兵錯誤。sentinel錯誤變量可用於在處理時比較這些值。

使用示例:源代碼/src/io/io.go中定義的哨兵錯誤變量EOF代表文件的結尾。

在beego項目中,beego/core/utils/file.go文件中有這樣壹個應用。讀取文件時,如果遇到的錯誤不是文件末尾的錯誤,會直接返回。如果是文件末尾的錯誤,for循環會被中斷,說明文件已經讀取了文件中的所有內容。如下所示:

2.2由fmt創建。Errorf方法。

使用場景1:不帶%w占位符:

創建錯誤時,不能通過錯誤創建的字符串信息來描述錯誤。新增,但是需要通過占位符添加更多的上下文信息,也就是動態信息。

使用示例:不帶%w占位符:

下面的例子摘自gorm/schema/relationship.go的部分代碼,當foreignKey不合法時,通過fmt.errorf返回壹個帶有特定外鍵的錯誤(“無效外鍵:% s”,foreign key)。因為外鍵值只能在運行時確定。代碼如下:

使用場景2:帶有%w的占位符:

在某些場景下,調用者需要知道原始錯誤信息,壹般通過錯誤判斷錯誤鏈是否包含特定類型的原始錯誤值。就是功能。

用%w占位符創建的錯誤消息實際上形成了壹個錯誤鏈。其用法如下:

讓我們再來看看源代碼:

根據源代碼,如果%w占位符包含在fmt中。Errorf,創建wrapError結構類型的值。讓我們來看看wrapError結構的定義:

err字段是原始錯誤,msg是格式化的錯誤消息。

使用示例:帶有%w的占位符:

假設我們有壹個從數據庫中查詢合同的函數。當來自數據庫的查詢顯示記錄為空時,sql。將返回ErrNoRows錯誤。我們用壹個%w占位符將錯誤包裝起來,並返回給調用者。

好了,現在GetContract的調用者可以知道原來的錯誤消息了。在調用者邏輯中,我們可以使用錯誤。是確定sql的值。ErrNoRows包含在err中。讓我們看看調用者的代碼:

使用場景:這是相對於錯誤的。新增,適用於可預測錯誤的定義。當發生不可預測的錯誤時,您需要自定義錯誤類型。

使用示例:我們以go source code /src/io/fs/fs.go文件中的源代碼為例,看看自定義錯誤類型需要包含哪些元素。

首先看結構。有壹個Err接口類型的Err,它表示錯誤源。因為根據上面的解釋,當錯誤層被傳回調用者時,我們需要跟蹤每壹層的原始錯誤信息,所以我們需要這個字段來包裝錯誤,形成壹個錯誤鏈。此外,還有兩個字段Op和Path,分別表示導致錯誤的操作和操作的路徑。這兩個字段就是所謂的意外錯誤:不確定哪個路徑發生了什麽錯誤。

讓我們看看這種錯誤類型在代碼中的應用:

應用1:go的文件src/embed/embed.go中的代碼,在讀取壹個目錄時,返回壹個PathError類型,意思是讀取目錄時,由於是目錄,文件內容不能直接讀取。

應用二:在go的文件src/embed/embed.go中的代碼中,有壹個文件讀取函數。當偏移量小於0時,返回PathError,這意味著在讀取文件時參數不正確。

fs的定義。ErrInvalid如下:

可以看出,PathError中三個字段的值是不可預測的,需要在程序運行時詳細確定,所以在這種場景下,需要自定義錯誤類型。

此外,我們還註意到,在這個自定義類型中有壹個Unwrap函數,主要與errors結合使用。是和錯誤。As,因為這兩個函數是用來逐個解包錯誤鏈的。

根據上壹節,我們可以通過%w個占位符將錯誤組織成壹個錯誤鏈。

錯誤的功能。Is是判斷錯誤鏈中是否有等於指定錯誤值的錯誤,等於= =運算符。註意,這是壹個特定的錯誤值,就像gorm中定義的ErrRecordNotFound:

然後我們可以使用錯誤。是這樣的:

錯誤。作為函數,該函數用於檢查錯誤鏈中的錯誤是否為特定類型。下面的代碼示例摘自etcd項目中etcd/server/embed/config _ logging . go中的部分代碼,代表err鏈中是否有可視為json的錯誤。語法錯誤類型。如果是,將err中的錯誤值賦給SyntaxiError變量。代碼如下:

本文從應用場景的角度闡述了各種造錯方式的實際應用場景。示例中的代碼盡量選自golang源代碼或開源項目。同時,每個應用場景都不是絕對的,需要靈活應用。希望這篇文章能在實際使用中對大家有所幫助。

  • 上一篇:高校心理健康班會活動綜述
  • 下一篇:找壹個能讓我玩壹個月的遊戲,工作開始無聊了。
  • copyright 2024遊戲中心平台