自营店网站建设,深圳保障性住房和安居房的区别,施工合同简单通用版,静态网页设计制作实训报告摘要什么是错误#xff1f; 
错误表示程序中发生的任何异常情况。假设我们正在尝试打开一个文件#xff0c;但该文件在文件系统中不存在。这是一种异常情况#xff0c;表示为错误。 
Go 中的错误是普通的旧值。就像任何其他内置类型#xff08;例如 int、float64 等#xff09…什么是错误 
错误表示程序中发生的任何异常情况。假设我们正在尝试打开一个文件但该文件在文件系统中不存在。这是一种异常情况表示为错误。 
Go 中的错误是普通的旧值。就像任何其他内置类型例如 int、float64 等一样错误值可以存储在变量中、作为参数传递给函数、从函数返回等。 
错误使用内置error 类型表示。我们将在本教程后面详细了解该error类型。 
例子 
让我们立即开始尝试打开一个不存在的文件的示例程序。 
package mainimport (  fmtos
)func main() {  f, err : os.Open(/test.txt)if err ! nil {fmt.Println(err)return}fmt.Println(f.Name(), opened successfully)
}Run in playground 
在上面程序的第 9 步中我们尝试打开路径中的文件/test.txt该文件显然不会存在于 Playground 中。包的*Open*函数os具有以下签名 
*func Open(名称字符串) (File, error) 
如果文件已成功打开则 Open 函数将返回文件处理程序错误将为 nil。如果打开文件时出现错误将返回非零错误。 
如果函数或方法返回错误那么按照惯例它必须是函数返回的最后一个值。因此该Open函数返回error最后一个值。 
**Go 中处理错误的惯用方法是将返回的错误与nil. nil 值表示没有发生错误非 nil 值表示存在错误。**在我们的例子中 
我们检查错误是否不等于nil。如果不是nil我们只需打印错误并从主函数返回。 
运行该程序将打印 
open /test.txt: No such file or directory  完美。我们收到一条错误消息指出该文件不存在。 
错误类型表示 
让我们更深入地研究一下内置error类型是如何定义的。error是具有以下定义的接口类型 
type error interface {  Error() string
}它包含一个带有签名的方法Error() string。任何实现此接口的类型都可以用作错误。此方法提供错误的描述。 
当打印错误时fmt.Println函数内部调用该Error() string 方法来获取错误的描述打印方式 
从错误中提取更多信息的不同方法 
现在我们知道了error是一个接口类型让我们看看如何提取有关错误的更多信息。 
在上面的示例中我们刚刚打印了错误的描述。如果我们想要导致错误的文件的实际路径怎么办获取此信息的一种可能方法是解析错误字符串。这是我们程序的输出 
open /test.txt: No such file or directory  我们可以解析此错误消息并获取导致错误的文件的文件路径“/test.txt”但这是一种肮脏的做法。在较新版本的 Go 中错误描述可能随时更改我们的代码将会崩溃。 
有没有更好的方法来获取文件名答案是肯定的这是可以做到的并且 Go 标准库使用不同的方式来提供有关错误的更多信息。让我们一一看看。 
1. 将错误转换为基础类型并从结构体字段中检索更多信息 
如果你仔细阅读Open函数的文档你会发现它返回一个类型为*PathError. PathError的错误它是一个结构体类型它在标准库中的实现如下 
type PathError struct {  Op   stringPath stringErr  error
}func (e *PathError) Error() string { return e.Op     e.Path  :   e.Err.Error() }  如果您有兴趣知道上述源代码存在于哪里可以在这里找到https://cs.opensource.google/go/go//refs/tags/go1.19:src/io/fs/fs .go;l250 
从上面的代码中你可以明白是通过声明方法*PathError来实现的。此方法将操作、路径和实际错误连接起来并返回。因此我们得到了错误消息error interfaceError() string 
open /test.txt: No such file or directory  Pathstruct 字段 包含PathError导致错误的文件的路径。 
我们可以使用errors包中的As函数将错误转换为其基础类型。该As函数的描述谈到了错误链。请暂时忽略它。我们将在单独的教程中了解错误链和包装的工作原理。 简单的描述As是它尝试将错误转换为错误类型并返回 true 或 false 指示转换是否成功。 
一个程序会让事情变得清晰。让我们修改上面编写的程序并使用该As函数打印路径。 
package mainimport (  errorsfmtos
)func main() {  f, err : os.Open(test.txt)if err ! nil {var pErr *os.PathErrorif errors.As(err, pErr) {fmt.Println(Failed to open file at path, pErr.Path)return}fmt.Println(Generic error, err)return}fmt.Println(f.Name(), opened successfully)
}Run in playground 
在上面的程序中我们首先检查错误是否不在nil, 然后我们使用As的函数。 转换err为*os.PathError. 
如果转换成功As将返回true。 
如果您想知道为什么pErr是指针原因是错误接口是由指针实现的PathError因此pErr是指针。下面的代码显示了*PathError错误接口的实现。 
func (e *PathError) Error() string { return e.Op     e.Path  :   e.Err.Error() }  该As函数要求第二个参数是指向实现错误的类型的指针。因此我们通过了perr。 
该程序输出 
Failed to open file at path test.txt  如果底层错误不是*os.PathError 类型则打印一般错误消息。 
太棒了。我们已经成功地使用该As函数从错误中获取文件路径。 
2. 使用方法检索更多信息 
从错误中获取更多信息的第二种方法是找出基础类型并通过调用结构类型上的方法来获取更多信息。 
让我们通过一个例子更好地理解这一点。 
标准库中的DNSError*结构*类型定义如下 
type DNSError struct {  ...
}func (e *DNSError) Error() string {  ...
}
func (e *DNSError) Timeout() bool {  ... 
}
func (e *DNSError) Temporary() bool {  ... 
}该DNSError结构有两个方法Timeout() boolTemporary()它们返回一个布尔值指示错误是由于超时还是临时错误。 
让我们编写一个程序将错误转换为*DNSError类型并调用上述方法来确定错误是暂时的还是由于超时造成的。 
package mainimport (  errorsfmtnet
)func main() {  addr, err : net.LookupHost(baidu12345.com)if err ! nil {var dnsErr *net.DNSErrorif errors.As(err, dnsErr) {if dnsErr.Timeout() {fmt.Println(operation timed out)return}if dnsErr.Temporary() {fmt.Println(temporary error)return}fmt.Println(Generic DNS error, err)return}fmt.Println(Generic error, err)return}fmt.Println(addr)
}注意DNS 查找在 Playground 中不起作用。请在您的本地计算机上运行该程序。 
在上面的程序中我们正在尝试获取无效域名的IP地址baidu123.com。我们通过使用As该函数并将其转换为DNSError 来 获取错误的基本值。然后我们分别在14和18行检查错误是由于超时还是暂时错误的。 
在我们的例子中错误既不是暂时的也不是由于超时造成的因此程序将打印 
Generic DNS error lookup baidu12345.com: no such host 
如果错误是暂时的或者由于超时那么相应的 if 语句就会执行我们可以适当地处理它。 
3. 直接比较 
获取有关错误的更多详细信息的第三种方法是直接与 类型的变量进行比较error。让我们通过一个例子来理解这一点。 
包的Glob函数filepath用于返回与某个模式匹配的所有文件的名称。当模式格式错误时此ErrBadPattern函数将返回错误。 
ErrBadPattern在包中定义filepath为全局变量。 
var ErrBadPattern  errors.New(syntax error in pattern)  error.New() 用于创建一个新错误。我们将在下一个教程中详细讨论这一点。 
当模式格式错误时Glob 函数将返回ErrBadPattern 。 
让我们编写一个小程序来检查此错误。 
package mainimport (  errorsfmtpath/filepath
)func main() {  files, err : filepath.Glob([)if err ! nil {if errors.Is(err, filepath.ErrBadPattern) {fmt.Println(Bad pattern error:, err)return}fmt.Println(Generic error:, err)return}fmt.Println(matched files, files)
}Run in playground 
在上面的程序中我们搜索格式[错误的模式文件。我们检查错误是否不为nil。为了获得有关错误的更多信息我们直接使用Is函数将filepath.ErrBadPatterninline 进行比较。与 类似As该Is函数在错误链上工作。我们将在下一个教程中了解更多相关内容。 出于本教程的目的如果传递给该函数的两个错误相同则Is可以将该函数视为true然后返回。 
Is第 12 行返回 true 。因为错误是由于格式错误造成的。该程序将打印 
Bad pattern error: syntax error in pattern  标准库使用上述任何一种方法来提供有关错误的更多信息。我们将在下一个教程中使用这些方法来创建我们自己的自定义错误 
不要忽视错误 
永远不要忽视错误。忽略错误会招致麻烦。让我重写示例其中列出了与模式匹配的所有文件的名称忽略错误。 
package mainimport (  fmtpath/filepath
)func main() {  files, _ : filepath.Glob([)fmt.Println(matched files, files)
}Run in playground 
从前面的例子中我们已经知道是无效的。我通过_使用空白标识符忽略了函数返回的错误。我只是打印匹配的文件。该程序将打印 
matched files []  由于我们忽略了该错误因此输出看起来好像没有文件与该模式匹配但实际上该模式本身格式错误。所以永远不要忽视错误。 
本教程到此结束。 文章转载自: http://www.morning.wnnts.cn.gov.cn.wnnts.cn http://www.morning.yqgny.cn.gov.cn.yqgny.cn http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn http://www.morning.mrbmc.cn.gov.cn.mrbmc.cn http://www.morning.jsphr.cn.gov.cn.jsphr.cn http://www.morning.jiuyungps.com.gov.cn.jiuyungps.com http://www.morning.sfrw.cn.gov.cn.sfrw.cn http://www.morning.jrsgs.cn.gov.cn.jrsgs.cn http://www.morning.mlyq.cn.gov.cn.mlyq.cn http://www.morning.nnhrp.cn.gov.cn.nnhrp.cn http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.bljcb.cn.gov.cn.bljcb.cn http://www.morning.ykmtz.cn.gov.cn.ykmtz.cn http://www.morning.dmjhp.cn.gov.cn.dmjhp.cn http://www.morning.bwmq.cn.gov.cn.bwmq.cn http://www.morning.gsksm.cn.gov.cn.gsksm.cn http://www.morning.rxydr.cn.gov.cn.rxydr.cn http://www.morning.gl-group.cn.gov.cn.gl-group.cn http://www.morning.jwncx.cn.gov.cn.jwncx.cn http://www.morning.lhrxq.cn.gov.cn.lhrxq.cn http://www.morning.ssjry.cn.gov.cn.ssjry.cn http://www.morning.ngdkn.cn.gov.cn.ngdkn.cn http://www.morning.cszbj.cn.gov.cn.cszbj.cn http://www.morning.ztqj.cn.gov.cn.ztqj.cn http://www.morning.wgbmj.cn.gov.cn.wgbmj.cn http://www.morning.nwzcf.cn.gov.cn.nwzcf.cn http://www.morning.khclr.cn.gov.cn.khclr.cn http://www.morning.nhdmh.cn.gov.cn.nhdmh.cn http://www.morning.cwznh.cn.gov.cn.cwznh.cn http://www.morning.pplxd.cn.gov.cn.pplxd.cn http://www.morning.qbgdy.cn.gov.cn.qbgdy.cn http://www.morning.jllnh.cn.gov.cn.jllnh.cn http://www.morning.zxrtt.cn.gov.cn.zxrtt.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.rzmkl.cn.gov.cn.rzmkl.cn http://www.morning.qlznd.cn.gov.cn.qlznd.cn http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.rbnnq.cn.gov.cn.rbnnq.cn http://www.morning.jrlxz.cn.gov.cn.jrlxz.cn http://www.morning.ybmp.cn.gov.cn.ybmp.cn http://www.morning.gmjkn.cn.gov.cn.gmjkn.cn http://www.morning.zckhn.cn.gov.cn.zckhn.cn http://www.morning.mygbt.cn.gov.cn.mygbt.cn http://www.morning.wphfl.cn.gov.cn.wphfl.cn http://www.morning.cpgdy.cn.gov.cn.cpgdy.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.jljiangyan.com.gov.cn.jljiangyan.com http://www.morning.yxnkr.cn.gov.cn.yxnkr.cn http://www.morning.zxrtt.cn.gov.cn.zxrtt.cn http://www.morning.bwkzn.cn.gov.cn.bwkzn.cn http://www.morning.gqmhq.cn.gov.cn.gqmhq.cn http://www.morning.npbkx.cn.gov.cn.npbkx.cn http://www.morning.rdymd.cn.gov.cn.rdymd.cn http://www.morning.fbmrz.cn.gov.cn.fbmrz.cn http://www.morning.zcnfm.cn.gov.cn.zcnfm.cn http://www.morning.tstkr.cn.gov.cn.tstkr.cn http://www.morning.mqpdl.cn.gov.cn.mqpdl.cn http://www.morning.jjsxh.cn.gov.cn.jjsxh.cn http://www.morning.hlhqs.cn.gov.cn.hlhqs.cn http://www.morning.hhmfp.cn.gov.cn.hhmfp.cn http://www.morning.pkggl.cn.gov.cn.pkggl.cn http://www.morning.wmglg.cn.gov.cn.wmglg.cn http://www.morning.tgmfg.cn.gov.cn.tgmfg.cn http://www.morning.yqgbw.cn.gov.cn.yqgbw.cn http://www.morning.mfbcs.cn.gov.cn.mfbcs.cn http://www.morning.pbzgj.cn.gov.cn.pbzgj.cn http://www.morning.jzccn.cn.gov.cn.jzccn.cn http://www.morning.gkgr.cn.gov.cn.gkgr.cn http://www.morning.rwqj.cn.gov.cn.rwqj.cn http://www.morning.rnqrl.cn.gov.cn.rnqrl.cn http://www.morning.pdtjj.cn.gov.cn.pdtjj.cn http://www.morning.xqmd.cn.gov.cn.xqmd.cn http://www.morning.lgwpm.cn.gov.cn.lgwpm.cn http://www.morning.wpcfh.cn.gov.cn.wpcfh.cn http://www.morning.pcxgj.cn.gov.cn.pcxgj.cn http://www.morning.rhjsx.cn.gov.cn.rhjsx.cn http://www.morning.c7627.cn.gov.cn.c7627.cn http://www.morning.yltyz.cn.gov.cn.yltyz.cn http://www.morning.yrctp.cn.gov.cn.yrctp.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn