处理错误的Go模式是什么

处理错误的Go模式是什么,go,Go,我不知道如何毫无例外地处理不同类型的错误。 在python中,我将执行以下操作: class BigError(Exception): pass class MediumError(Exception): pass class SmallError(Exception): pass def get_data(): try: data = read_data(...) except IOError as e: if e.errno =

我不知道如何毫无例外地处理不同类型的错误。 在python中,我将执行以下操作:

class BigError(Exception):
  pass

class MediumError(Exception):
   pass

class SmallError(Exception):
  pass

def get_data():
   try:
        data = read_data(...)
   except IOError as e:
        if e.errno == <something serious>:
              raise BigError(str(e))
        elif e.errno == <samething small>:
              raise SmallError(str(e))
        raise # for other IOErrors


def process_data():
   # at this level I do not care about errors
   data = get_data()
   process(data)

def do_job():
   try:
       for _ in range(10):
           try:
               process_data()
           except SmallError as e:
               print(f"Small Error: {e}")
               time.sleep(10) # lets wait - could be that problem will be solved
           except MediumError as e:
               print("Continue?")
               yes_no = input()
               if yes_no == "no":
                   break
   except BigError as e:
      print(f"Sorry: {e}")
      return 
类大错误(异常):
通过
类MediumError(异常):
通过
类错误(异常):
通过
def get_data():
尝试:
数据=读取数据(…)
除IOE错误外:
如果e.errno==:
升起大错误(str(e))
elif e.errno==:
小错误(str(e))
针对其他IOR错误,提出#
def process_data():
#在这个级别上,我不关心错误
数据=获取数据()
过程(数据)
def do_job():
尝试:
对于范围(10)内的uu:
尝试:
处理数据()
除小错误外,如e:
打印(f“小错误:{e}”)
时间。睡眠(10)#让我们等一等——这个问题会解决吗
除介质错误外,如e:
打印(“是否继续?”)
是\否=输入()
如果是_否==“否”:
打破
除e中的大错误外:
打印(f“对不起:{e}”)
返回
如何在Go中实现相同的方法,即在不同级别处理不同严重性的不同错误?如果我返回一些错误,如何在不同的代码级别处理不同的错误

func getData() (data, error) {
    data, err := readData(...)
    if err != nil {
        // How to tell what is this error?
        return nil, err
    }
    return data, nil

func processData() error {
    data, err = get_data()
    if err != nil {
        return err
    }
    process(data)
    return nil

func doJob() {
   for i := 0; i < 10; i++ {
        err := processData()
        if err != nil {
             if err == <small error> {
                    fmt.Printf("Small error: %s\n", err)
                    // sleep
            } else if err == <medium error> {
                // Ask user 
            } else if err == <big error> {
                return 
            }
}
func getData()(数据,错误){
数据,错误:=读取数据(…)
如果错误!=零{
//如何判断这个错误是什么?
返回零,错误
}
返回数据,无
func processData()错误{
数据,err=get_data()
如果错误!=零{
返回错误
}
过程(数据)
归零
func doJob(){
对于i:=0;i<10;i++{
错误:=processData()
如果错误!=零{
如果错误=={
fmt.Printf(“小错误:%s\n”,错误)
//睡眠
}如果错误=={
//询问用户
}如果错误=={
返回
}
}

那么这些和其他部分应该是什么呢?这样做的“go风格”是什么?

谷歌查询“go错误处理类型”@Adrian在上面的评论中提供了有关此主题的所有必要信息。

您需要澄清什么?错误只是值,它们作为常规返回值返回,与任何其他值一样处理。您能澄清您的问题吗?如何在一个级别上恢复小错误,请用户提供medium级别错误,并因硬错误而使应用程序崩溃?Go中的错误只是值而不是类型!如果我在Go中实现相同的代码,我将从process_数据函数中获取一些err变量,接下来会发生什么?错误是值,所有值都有类型。错误可以是实现
error
接口的任何类型的任何值。因此问题仍然不清楚:您正在努力处理的错误是什么?如果您想以不同的方式处理不同的错误,那么就以不同的方式处理它们。我无法使用Google找到示例。go中更好的方法是什么?创建不同的“类型MyError struct{}”,并检查它们的类型(使用什么?)或创建不同的全局变量“bigerro:=errors.New(“可怕的东西”)”然后检查“if err=bigerro{”。然后如何区分来自低级代码和标准库的错误?当我接收到高级err值时,如何判断它是否是IOError(如python中的错误)或其他类型的错误。不确定您正在搜索什么,但
go-error-handling by-type
为我提供了大量相关信息和详细示例。另外,请看一看相对较新的版本,该版本提供了根据类型或值检查错误(包括包装错误)的帮助。