Skip to main content

Errors

You can define errors in protos and generate enums with protoc-gen-go.

Error in errors pacakge implements GRPCStatus() interface.

{    // Error code, this is consistent with grpc-status and will be convert to http-status in HTTP    "code": 3,    // Error message, is a human-readable message.    "message": "invalid argument error",    // Error details    "details": [        {            "@type": "type.googleapis.com/google.rpc.ErrorInfo",            // Error Reason, is the Error code in business logic.            "reason": "custom_error",            // Error domain, is the business domain.            "domain": "helloworld"        }    ]}

Installation#

go install google.golang.org/protobuf/cmd/protoc-gen-go

Error Defination#

api/helloworld/v1/helloworld.proto

syntax = "proto3";
package api.helloworld.v1;
// language-specified package nameoption go_package = "api/helloworld/v1;v1";option java_multiple_files = true;option java_package = "helloworld.v1";option objc_class_prefix = "APIHelloworldV1";
enum ErrorReason {  // Do not use this default value.  ERROR_REASON_UNSPECIFIED = 0;  // The request is calling a disabled service for a consumer.  SERVICE_DISABLED = 1;}

Error Generation#

To generate code with protoc.

protoc --go_out=. --go_opt=paths=source_relative api/helloworld/v1/error_reason.proto

Usage#

import "github.com/go-kratos/kratos/errors"import "<app>/api/helloworld/v1"
func doSomething() error {    return errors.BadRequest("hellworld", v1.SERVICE_DISABLED.String(), "service has been disabled")}
if err := doSomething(); errors.IsBadRequest(err) {    // TODO}
if err := doSomething(); errors.Reason(err) == v1.SERVICE_DISABLED.String() {    // TODO}