我如何访问 golang 中的错误单个属性

Jos*_*eph 0 error-handling go amazon-web-services aws-datasync

!! 我是新来的!

我正在使用 datasync API 来启动任务执行,没有任何问题。我正在努力处理返回的错误结构,我想访问各个元素,但我似乎无法做到这一点。

例如,在以下错误中我希望能够访问Message_的内容

2022/03/19 09:33:48 Sync called : 
InvalidRequestException: Unable to queue the task execution for task task-xxxxxxxxxxxx. The task already has another task execution exec-030b4a31dc2e33641 currently running or queued with identical Include and Exclude filter patterns. Please provide unique Include and Exclude filter patterns for the new task execution and try again.
{
  RespMetadata: {
    StatusCode: 400,
    RequestID: "xxxxxxxxxxxxxxxxxxxxx"
  },
  ErrorCode: "DedupeFailed",
  Message_: "Unable to queue the task execution for task task-xxxxxxxxxx. The task already has another task execution exec-xxxxxxxxxx currently running or queued with identical Include and Exclude filter patterns. Please provide unique Include and Exclude filter patterns for the new task execution and try again."
}
Run Code Online (Sandbox Code Playgroud)

这是我的工作示例:

    // Create datasync service client
    svc := datasync.New(sess)

    params := &datasync.StartTaskExecutionInput{
        TaskArn : aws.String("arn:aws:datasync:*******************************"),
    }

    // start task execution
    resp, err := svc.StartTaskExecution(params)

    //err = req.Send()

    if err == nil { // resp is now filled
        fmt.Println(resp)  // this outputs this { TaskExecutionArn: "arn:aws:datasync:xxxxxxxx:task/task-03ecb7728e984e36a/execution/exec-xxxxxxxxxx" }

    } else {
        fmt.Println(err)
        //fmt.Println(err.Message()) THIS DOES NOT WORK
        //fmt.Println(err.Message_)  THIS ALSO DOES NOT WORK
    }
Run Code Online (Sandbox Code Playgroud)

如果我这样做fmt.Println(err.Message())或者this fmt.Println(err.Message_)我得到这个error err.Message undefined (type error has no field or method Message) err.Message_ undefined (type error has no field or method Message_)

我哪里做错了 ?

Jen*_*ens 5

AWS SDK for Go 中的错误通常与接口有关awserr.ErrorGithub 上的代码)。

如果您只是想收到消息,可以这样做:

resp, err := svc.StartTaskExecution(params)

if err != nil {
    if awsErr, ok := err.(awserr.Error); ok {
        fmt.Println(awsErr.Message())
    } else {
        fmt.Println(err.Error())
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,检查是否确实存在错误:

if err != nil {...}
Run Code Online (Sandbox Code Playgroud)

然后,我们尝试将错误转换为特定的“类型” awserr.Error

err.(awserr.Error)
Run Code Online (Sandbox Code Playgroud)

强制转换的返回值是特定错误awsErrbool指示强制转换是否有效的 ( ok)。

awsErr, ok := err.(awserr.Error)
Run Code Online (Sandbox Code Playgroud)

其余的代码基本上只是检查,如果ok == true是这种情况,您可以访问错误字段,例如Message

if awsErr, ok := err.(awserr.Error); ok {
    fmt.Println(awsErr.Message())
}
Run Code Online (Sandbox Code Playgroud)

否则,您只需打印标准 Go 错误消息:

if awsErr, ok := err.(awserr.Error); ok {
    ...
} else {
    fmt.Println(err.Error())
}
Run Code Online (Sandbox Code Playgroud)