使用自定義錯(cuò)誤碼攔截grpc內(nèi)部狀態(tài)碼問(wèn)題
使用自定義錯(cuò)誤碼攔截grpc內(nèi)部狀態(tài)碼
在golang項(xiàng)目中,通過(guò)grpc開發(fā)時(shí),對(duì)于非法傳入的參數(shù)、解析失敗、返回異常時(shí),雖然使用的是自定義的狀態(tài)碼,如果不做特殊處理,grpc默認(rèn)會(huì)使用其內(nèi)部的狀態(tài)碼進(jìn)行攔截。
如果想要使用自定義的錯(cuò)誤碼,應(yīng)該如何處理呢?
這里提供一種方式可以自由使用自定義的狀態(tài)碼,雖然不能從全局?jǐn)r截grpc狀態(tài)碼,但也能夠做到簡(jiǎn)潔方便地處理自定義狀態(tài)碼,具體只需在返回error之前,通過(guò)status.Errorf()傳入自定義錯(cuò)誤碼和錯(cuò)誤信息描述即可。
import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) err = status.Errorf(codes.Code(resp.ErrNum), errcode.GetCodeDesc(int(resp.ErrNum)))
其中,resp表示返回結(jié)構(gòu),ErrNum表示錯(cuò)誤碼,GetCodeDesc函數(shù)通過(guò)錯(cuò)誤碼返回對(duì)應(yīng)的錯(cuò)誤信息描述。
status.Errorf函數(shù)定義如下:
// A Code is an unsigned 32-bit error code as defined in the gRPC spec. type Code uint32 // Errorf returns Error(c, fmt.Sprintf(format, a...)). func Errorf(c codes.Code, format string, a ...interface{}) error { return Error(c, fmt.Sprintf(format, a...)) }
grpc成功和異常狀態(tài)碼
所在包:
package io.grpc;
所在類:
Status?
public static final Status OK; public static final Status CANCELLED; public static final Status UNKNOWN; public static final Status INVALID_ARGUMENT; public static final Status DEADLINE_EXCEEDED; public static final Status NOT_FOUND; public static final Status ALREADY_EXISTS; public static final Status PERMISSION_DENIED; public static final Status UNAUTHENTICATED; public static final Status RESOURCE_EXHAUSTED; public static final Status FAILED_PRECONDITION; public static final Status ABORTED; public static final Status OUT_OF_RANGE; public static final Status UNIMPLEMENTED; public static final Status INTERNAL; public static final Status UNAVAILABLE; public static final Status DATA_LOSS;
Ok
:返回成功Canceled
:操作已取消Unknown
:未知錯(cuò)誤。如果從另一個(gè)地址空間接收到的狀態(tài)值屬 于在該地址空間中未知的錯(cuò)誤空間,則可以返回此錯(cuò)誤的示例。 沒(méi)有返回足夠的錯(cuò)誤信息的API引發(fā)的錯(cuò)誤也可能會(huì)轉(zhuǎn)換為此錯(cuò)誤InvalidArgument
:表示客戶端指定了無(wú)效的參數(shù)。 請(qǐng)注意,這與FailedPrecondition不同。 它表示無(wú)論系統(tǒng)狀態(tài)如何(例如格式錯(cuò)誤的文件名)都有問(wèn)題的參數(shù)DeadlineExceeded
:意味著操作在完成之前過(guò)期。 對(duì)于更改系統(tǒng)狀態(tài)的操作,即使操作成功完成,也可能會(huì)返回此錯(cuò)誤。 例如,服務(wù)器的成功響應(yīng)可能會(huì)延遲足夠的時(shí)間以使截止日期到期NotFound
:表示找不到某個(gè)請(qǐng)求的實(shí)體(例如文件或目錄)AlreadyExists
:表示嘗試創(chuàng)建實(shí)體失敗,因?yàn)橐呀?jīng)存在PermissionDenied
:表示調(diào)用者沒(méi)有執(zhí)行指定操作的權(quán)限。它不能用于因耗盡某些資源而引起的拒絕(使用ResourceExhausted代替這些錯(cuò)誤)。如果調(diào)用者無(wú)法識(shí)別,則不能使用它(使用Unauthenticated代替這些錯(cuò)誤)ResourceExhausted
:表示某些資源已耗盡,可能是每個(gè)用戶的配額,或者整個(gè)文件系統(tǒng)空間不足FailedPrecondition
:表示操作被拒絕,因?yàn)橄到y(tǒng)不處于操作執(zhí)行所需的狀態(tài)。Aborted
:表示操作被中止,通常是由于并發(fā)問(wèn)題(如序列器檢查失敗,事務(wù)異常終止等)造成的。請(qǐng)參閱上面的試金石測(cè)試以確定FailedPrecondition,Aborted和Unavailable之間的差異OutOfRange
:表示操作嘗試超過(guò)有效范圍。Unimplemented
:該方法未實(shí)現(xiàn)Internal
: 意味著底層系統(tǒng)預(yù)期的一些不變量已被打破。 如果你看到其中的一個(gè)錯(cuò)誤,那么事情就會(huì)非常糟糕Unavailable
:內(nèi)部Grpc服務(wù)不可用,請(qǐng)求不到DataLoss
:指示不可恢復(fù)的數(shù)據(jù)丟失或損壞Unauthenticated
:表示請(qǐng)求沒(méi)有有效的操作認(rèn)證憑證
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作
這篇文章主要介紹了xorm根據(jù)數(shù)據(jù)庫(kù)生成go model文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12golang?gorm模型結(jié)構(gòu)體的定義示例
這篇文章主要為大家介紹了golang?gorm模型結(jié)構(gòu)體的定義示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Golang基礎(chǔ)教程之字符串string實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Golang基礎(chǔ)教程之字符串string的相關(guān)資料,需要的朋友可以參考下2022-07-07Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入
這篇文章主要給大家介紹了關(guān)于Golang小數(shù)操作指南之判斷小數(shù)點(diǎn)位數(shù)與四舍五入的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03go語(yǔ)言題解LeetCode1299將每個(gè)元素替換為右側(cè)最大元素
這篇文章主要為大家介紹了go語(yǔ)言LeetCode刷題1299將每個(gè)元素替換為右側(cè)最大元素示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01在ubuntu下構(gòu)建go語(yǔ)言開發(fā)環(huán)境的方法
這篇文章主要介紹了在ubuntu下構(gòu)建go語(yǔ)言開發(fā)環(huán)境的方法,需要的朋友可以參考下2014-10-10