区块链服务 BCS-开发规范:防止出现panic后链代码容器异常

时间:2025-01-14 15:42:38

防止出现panic后链代码容器异常

该内容仅适用于Fabric架构版本的 区块链 实例的Go语言链代码开发。

为避免出现panic异常时链代码容器异常重启,找不到日志,导致问题无法及时定位,可在Invoke函数入口处添加defer语句时,出现panic异常时返回错误给客户端。

// 定义命名返回值,发生panic在defer里面赋值,确保客户端可以收到返回值// 使用debug.PrintStack()将错误的堆栈信息打印到标准输出,方便问题定位func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) (pr pb.Response) {   defer func() {      if err:=recover(); err != nil {         fmt.Println("recover from invoke:", err)         debug.PrintStack()         pr = shim.Error(fmt.Sprintf("invoke painc. err: %v",err))      }   }()   fmt.Println("ex02 Invoke")   function, args := stub.GetFunctionAndParameters()   if function == "invoke" {      // Make payment of X units from A to B      return t.invoke(stub, args)   } else if function == "delete" {      // Deletes an entity from its state      return t.delete(stub, args)   } else if function == "query" {      // the old "Query" is now implemented in invoke      return t.query(stub, args)   }   pr = shim.Error("Invalid invoke function name. Expecting \"invoke\" \"delete\" \"query\"")   return pr}
support.huaweicloud.com/devg-bcs/bcs_devg_0830.html