```go type MyErr struct { value int } func (err *MyErr) Error() string { return "MyErr" } func test(a int) (int, error) { if a%2 == 0 { return a, nil } return 0, &MyErr{value: a} } func main() { _, err := test(1) if err != nil && err.Error() =="MyErr"{ fmt.Printf("error %d\n",err.(*MyErr).value); } }
var err error
var warnings []warning
var result xxx
// 调用
err,warnings,result = callfunc(args)
可以参考这种。
错误了, 就不应该在给出部分正确的信息, 除非这个错误本身就是可接受的, 比如同时向 100 个 API 推送消息, 但有个别 API 失败了这种场景(不影响主流程的).
大家有共识, 也不算问题.
https://go.dev/blog/errors-are-values
https://go.dev/blog/go1.13-errors
我补充一点个人理解:
Golang 语境中的错误 error 是一种可以预期的行为,预期之外的叫 Panic (对应其他编程语言中的 Exception )。
基于这种思想,Golang 中的错误处理有两个特点:
第一个特点就是上面两篇官方文档提到的,错误是值,使用这个值的方式是 wrap/unwrap ;
第二个特点是 Golang 主张显式控制流,所有的错误都应该按照调用链传播,并在恰当的位置进行处理。
这里“处理”的含义是停止传播,即忽略也是一种处理方式。
```go type MyErr struct { value int } func (err *MyErr) Error() string { return "MyErr" } func test(a int) (int, error) { if a%2 == 0 { return a, nil } return 0, &MyErr{value: a} } func main() { _, err := test(1) if err != nil && err.Error() =="MyErr"{ fmt.Printf("error %d\n",err.(*MyErr).value); } }// It returns the number of bytes written and an error, if any.
// Write returns a non-nil error when n != len(b).
func (f *File) Write(b []byte) (n int, err error) {