返回顶部
首页 > 资讯 > 后端开发 > GO >Golang 中具体类型的错误片段
  • 268
分享到

Golang 中具体类型的错误片段

2024-02-05 22:02:30 268人浏览 独家记忆
摘要

问题内容 我正在 Go 中尝试错误包装,并有一个返回包装的自定义错误类型的函数。我想做的是迭代预期错误列表并测试函数的输出是否包含这些预期错误。 我发现将自定义错误放入 []error

问题内容

我正在 Go 中尝试错误包装,并有一个返回包装的自定义错误类型的函数。我想做的是迭代预期错误列表并测试函数的输出是否包含这些预期错误。

我发现将自定义错误放入 []error 意味着自定义错误的类型将为 *fmt.wraperror,这意味着 errors.as() 几乎总是返回 true。

作为示例,请考虑以下代码:

package main

import (
    "errors"
    "fmt"
)

type anothererror struct {
}

func (e *anothererror) error() string {
    return "another error"
}

type missingattrerror struct {
    missingattr string
}

func (e *missingattrerror) error() string {
    return fmt.sprintf("missing attribute: %s", e.missingattr)
}

func dosomething() error {
    e := &missingattrerror{missingattr: "key"}
    return fmt.errorf("dosomething(): %w", e)
}

func main() {
    err := dosomething()
    expectederrone := &missingattrerror{}
    expectederrtwo := &anothererror{}
    expectederrs := []error{expectederrone, expectederrtwo}

    fmt.printf("is err '%v' type '%t'?: %t\n", err, expectederrone, errors.as(err, &expectederrone))
    fmt.printf("is err '%v' type '%t'?: %t\n", err, expectederrtwo, errors.as(err, &expectederrtwo))

    for i := range expectederrs {
        fmt.printf("is err '%v' type '%t'?: %t\n", err, expectederrs[i], errors.as(err, &expectederrs[i]))

    }
}

其输出为

is err 'dosomething(): missing attribute: key' type '*main.missingattrerror'?: true
is err 'dosomething(): missing attribute: key' type '*main.anothererror'?: false
is err 'dosomething(): missing attribute: key' type '*fmt.wraperror'?: true
is err 'dosomething(): missing attribute: key' type '*fmt.wraperror'?: true

理想情况下我希望输出是

Is err 'DoSomething(): missing attribute: Key' type '*main.MissingAttrError'?: true
Is err 'DoSomething(): missing attribute: Key' type '*main.AnotherError'?: false
Is err 'DoSomething(): missing attribute: Key' type '*main.MissingAttrError'?: true
Is err 'DoSomething(): missing attribute: Key' type '*main.AnotherError'?: false

出现错误的原因是我希望能够为每个测试用例条目定义预期错误的列表。假设我知道为函数提供某些输入将使其沿着一条路径返回包含特定错误的错误。

如何将 *fmt.wraperror 类型从 []error 切片转换回原始类型,以便我可以将其与 error.as 一起使用?

我知道我可以使用 将其强制转换为特定类型。(anothererror),但为了在迭代切片时使其工作,我必须对函数可能返回的每个可能的错误执行此操作,不是吗?)


正确答案


您可以使用以下方法欺骗 errors.as

func main() {
    err := DoSomething()
    m := &MissingAttrError{}
    a := &AnotherError{}
    expected := []any{&m, &a}

    for i := range expected {
        fmt.Printf("Is err '%v' type '%T'?: %t\n", err, expected[i], errors.As(err, expected[i]))
    }
}

打印的类型不是您所期望的,但 errors.as 按其应有的方式工作。

您的示例不起作用的原因是您传递给 errors.as 的是 *error。因此,包装的错误值(即 err)被直接分配给目标值。在我的示例中,传递给 errors.as 的值是 **anothererror,并且 err 不能分配给 *anothererror

以上就是golang 中具体类型的错误片段的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang 中具体类型的错误片段

本文链接: https://www.lsjlt.com/news/561114.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang 中具体类型的错误片段
    问题内容 我正在 go 中尝试错误包装,并有一个返回包装的自定义错误类型的函数。我想做的是迭代预期错误列表并测试函数的输出是否包含这些预期错误。 我发现将自定义错误放入 []error...
    99+
    2024-02-05
  • Golang类型断言的具体使用
    目录一,如何检测和转换接口变量的类型二,类型判断:type-switch一,如何检测和转换接口变量的类型 在Go语言的interface中可以是任何类型,所以Go给出了类型断言来判断...
    99+
    2023-03-08
    Golang 类型断言
  • golang 判断错误类型
    Golang 是一种简单、高效的编程语言,它拥有强大的类型系统和丰富的库,为开发者提供了极大的便利。在 Go 语言中,错误处理是一项非常重要的任务。当程序运行发生错误时,我们需要能够快速、准确地找出错误并进行处理。为了实现这一目标,我们需要...
    99+
    2023-05-15
  • 选择mysql字段类型的具体方法
    不知道大家之前对类似选择mysql字段类型的具体方法的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完选择mysql字段类型的具体方法你一定会有所收获的。整型时间类型...
    99+
    2024-04-02
  • golang函数类型的错误处理
    在 go 语言中,处理返回错误的函数时,可以使用函数类型,其包含一个额外的 error 类型返回类型。函数类型定义了函数签名的参数列表和返回类型,可以创建返回错误的函数并处理潜在的错误。...
    99+
    2024-04-29
    golang 错误处理
  • 如何识别 Golang 中的不同错误类型?
    golang 中错误类型识别至关重要。内置错误类型包括 error、valueerror、typeerror 和 indexoutofboundserror。自定义错误类型可通过实现 e...
    99+
    2024-05-14
    golang 错误处理
  • 一文聊聊golang错误类型
    Golang是一门功能强大的编程语言,自诞生以来就备受程序员们的热爱。其中的错误处理(error handling)机制也是Golang中非常重要的一个模块。本文将重点介绍Golang错误类型。在Golang中,错误类型指的是一个内置的接口...
    99+
    2023-05-14
  • 在Golang中实现自定义错误类型
    在 go 中创建自定义错误类型可提供更详细的错误消息。创建自定义错误类型:用 error 接口定义错误类型,实现 error() 方法返回错误消息。使用自定义错误类型:像使用任何其他错误...
    99+
    2024-04-15
    golang 关键词
  • 自定义golang函数错误类型
    是的,在 go 中可以定义自定义错误类型,通过创建实现 error 接口的结构体,并提供 error() 方法返回错误消息。自定义错误类型可以使用 errors.new 函数或自定义类型...
    99+
    2024-05-02
    golang 函数类型 关键词
  • golang中泛型的具体应用场景
    泛型在 go 中的应用场景:集合操作:创建适用于任何类型的集合操作,例如过滤。数据结构:编写通用的数据结构,如队列,栈和映射,可存储和操作各种类型的数据。算法:编写通用的算法,如排序,搜...
    99+
    2024-05-04
    golang 泛型
  • C#中IntPtr类型的具体使用
    什么是IntPtr 先来看看MSDN上说的:用于表示指针或句柄的平台特定类型。这个其实说出了这样两个事实,IntPtr 可以用来表示指针或句柄、它是一个平台特定类型。 C#中的Int...
    99+
    2024-04-02
  • 怎样处理Golang常见的错误类型
    Golang作为一门高效、简洁的编程语言,其错误处理机制也是非常强大的。在实际编码过程中,我们经常会遇到各种各样的错误类型,如文件读写错误、网络连接错误、数据格式错误等。本文将介绍Go...
    99+
    2024-02-28
    错误处理 异常处理 golang错误
  • 使用类型断言在golang函数中处理不同类型的错误
    在 go 函数中处理不同类型的错误时,可以使用类型断言来检查变量的实际类型并将其转换为所需的类型。类型断言的语法为:variable, ok := interfacevariable.(...
    99+
    2024-04-24
    编程 错误处理 golang
  • Golang泛型如何解决函数中与类型相关的错误?
    泛型解决了 go 函数中与类型相关的错误,允许创建通用函数,可接受并操作各种类型的数据。通过使用类型变量,泛型函数可以适应传递给它们的任何类型,从而避免类型冲突错误,并简化和提高代码的灵...
    99+
    2024-04-16
    go泛型 泛型错误修复 golang 编译错误
  • 如何在 Golang 中使用自定义错误类型?
    在 golang 中使用自定义错误类型可以创建特定于应用程序的更具描述性和可操作性的错误消息。步骤如下:声明自定义错误类型并实现 error 接口。在函数中返回自定义错误。使用 erro...
    99+
    2024-05-14
    golang 自定义错误类型
  • JavaScript中的六种错误类型
    刚入前端坑,英语又不太好的同学,是不是还在为控制台的错误抓耳挠腮?今天就带大家看一看javaScript中常见的错误类型。1. SyntaxError:语法错误// 1. Syntax Error: 语法错误// 1.1 变量名不符合规范v...
    99+
    2023-06-03
  • golang中的aws lambda由sqs触发并出现类型错误
    php小编百草这次为大家带来了关于golang中的AWS Lambda的问题。在使用AWS SQS触发Lambda函数时,可能会出现类型错误的情况。这个问题可能导致Lambda函数无法...
    99+
    2024-02-09
  • Golang:访问“any”类型泛型上的字段
    Golang是一种静态类型的编程语言,它在实现泛型的过程中一直备受关注。最近,Golang团队在设计泛型的方案上取得了重大突破,使得开发者能够访问“any”类型泛型上的字段。这个新特性...
    99+
    2024-02-10
    overflow
  • golang之数组切片的具体用法
    目录数组切片切片的创建直接声明new方式初始化字面量make方式截取方式s[:]s[i:]s[:j]s[i:j]s[i:j:x]看个例子切片的扩容内存对齐空切片和nil切片数组是值传...
    99+
    2024-04-02
  • Golang错误处理计划:错误类型分类及处理技巧详解
    Golang 错误处理计划:错误类型分类及处理技巧详解 引言: 错误处理是编程中一个至关重要的方面,它帮助我们在程序出现异常情况时做出及时的响应和处理。在 Golang 中,错误处理被...
    99+
    2024-03-09
    技巧 golang 错误处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作