Golang教程第30节--错误处理

Golang基础教程 第一章:走进Golang Golang引入 简介: Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种计算机编程语言语言。 设计初衷: Go语言是谷歌推出的一种的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,"使用它可以进行 阅读详情

原文来自:https://golangbot.com/error-handling/

什么是错误?

错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是一种异常情况,它用一个错误来表示。

在 Go 中,错误一直是很常见的。错误用内建的 error 类型来表示。

就像其他的内建类型(如 int、float64 等),错误值可以存储在变量里、作为函数的返回值等等。

示例

现在我们开始编写一个程序示例,该程序试图打开一个并不存在的文件:

package main

import (  
    "fmt"
    "os"
)

func main() {  
    f, err := os.Open("/test.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(f.Name(), "opened successfully")
}

在 playground 中运行

在程序的第 9 行,我们试图打开路径为 /test.txt 的文件(在playground中 显然并不存在这个文件)。os 包里的Open 函数有如下签名:

func Open(name string) (file *File, err error)

如果成功打开文件,Open 函数会返回一个文件句柄和一个值为 nil 的错误。如果打开文件时发生了错误,会返回一个不等于 nil 的错误。

如果一个函数 或方法 返回了错误,按照惯例,错误会作为最后一个值返回。因此Open 函数也将 err 作为最后一个返回值。

按照 Go 的惯例,在处理错误时,通常都是将返回的错误与 nil 比较。nil 值表示了没有错误发生,而非 nil 值表示出现了错误。在我们的例子里,第 10 行检查了错误值是否为 nil。如果不是 nil,我们会简单地打印出错误,并在 main 函数中返回。

运行该程序会输出:

open /test.txt: No such file or directory

很棒!我们得到了一个错误,它指出该文件并不存在。

错误类型的表示

让我们进一步深入,理解 error 类型是如何定义的。error 是一个接口类型,定义如下:

type error interface {  
    Error() string
}

error 有了一个签名为 Error() string 的方法。所有实现该接口的类型都可以当作一个错误类型。Error() 方法给出了错误的描述。

fmt.Println 在打印错误时,会在内部调用 Error() string 方法来得到该错误的描述。上一节示例中的第 11 行,就是这样打印出错误的描述的。

从错误获取更多信息的不同方法

现在,我们知道了 error 是一个接口类型,让我们看看如何从一个错误获取更多信息。

在前面的示例里,我们只是打印出错误的描述。如果我们想知道这个错误的文件路径,该怎么做呢?一种选择是直接解析错误的字符串。这是前面示例的输出:

open /test.txt: No such file or directory

我们解析了这条错误信息,虽然获取了发生错误的文件路径,但是这种方法很不优雅。随着语言版本的更新,这条错误的描述随时都有可能变化,使我们程序出错。

有没有更加可靠的方法来获取文件名呢?答案是肯定的,这是可以做到的,Go 标准库给出了各种提取错误相关信息的方法。我们一个个来看看吧。

1. 断言底层结构体类型,使用结构体字段获取更多信息

如果你仔细阅读了 Open函数的文档,你可以看见它返回的错误类型是 *PathError。PathError 是结构体类型,它在标准库中的实现如下:

type PathError struct {  
    Op   string
    Path string
    Err  error
}

func (e *PathError) Error() string { return e.Op + " " + e.Path + ": " + e.Err.Error() }

如果你有兴趣了解上述源代码出现的位置,可以在这里找到:https://golang.org/src/os/error.go?s=653:716#L11。

通过上面的代码,你就知道了 *PathError 通过定义 Error() string 方法,实现了 error 接口。Error() string 将文件操作、路径和实际错误拼接,并返回该字符串。于是我们得到该错误信息:

open /test.txt: No such file or directory

结构体 PathError 的 Path 字段,就有导致错误的文件路径。我们修改前面写的程序,打印出该路径。

package main

import (  
    "fmt"
    "os"
)

func main() {  
    f, err := os.Open("/test.txt")
    if err, ok := err.(*os.PathError); ok {
        fmt.Println("File at path", err.Path, "failed to open")
        return
    }
    fmt.Println(f.Name(), "opened successfully")
}

在 playground 上运行

在上面的程序里,我们在第 10 行使用了类型断言(Type Assertion)来获取 error 接口的底层值(Underlying Value)。接下来在第 11 行,我们使用 err.Path 来打印该路径。该程序会输出:

File at path /test.txt failed to open

很棒!我们已经使用类型断言成功获取到了该错误的文件路径。

2. 断言底层结构体类型,调用方法获取更多信息

第二种获取更多错误信息的方法,也是对底层类型进行断言,然后通过调用该结构体类型的方法,来获取更多的信息。

我们通过一个实例来理解这一点。

标准库中的 DNSError 结构体类型定义如下:

type DNSError struct {  
    ...
}

func (e *DNSError) Error() string {  
    ...
}
func (e *DNSError) Timeout() bool {  
    ... 
}
func (e *DNSError) Temporary() bool {  
    ... 
}

从上述代码可以看到,DNSError 结构体还有 Timeout() bool 和 Temporary() bool 两个方法,它们返回一个布尔值,指出该错误是由超时引起的,还是临时性错误。

接下来我们编写一个程序,断言 *DNSError 类型,并调用这些方法来确定该错误是临时性错误,还是由超时导致的。

package main

import (  
    "fmt"
    "net"
)

func main() {  
    addr, err := net.LookupHost("golangbot123.com")
    if err, ok := err.(*net.DNSError); ok {
        if err.Timeout() {
            fmt.Println("operation timed out")
        } else if err.Temporary() {
            fmt.Println("temporary error")
        } else {
            fmt.Println("generic error: ", err)
        }
        return
    }
    fmt.Println(addr)
}

注:在 playground 无法进行 DNS 解析。请在你的本地运行该程序。

在上述程序中,我们在第 9 行,试图获取 golangbot123.com(无效的域名) 的 ip。在第 10 行,我们通过 *net.DNSError 的类型断言,获取到了错误的底层值。接下来的第 11 行和第 13 行,我们分别检查了该错误是由超时引起的,还是一个临时性错误。

在本例中,我们的错误既不是临时性错误,也不是由超时引起的,因此该程序输出:

generic error:  lookup golangbot123.com: no such host

如果该错误是临时性错误,或是由超时引发的,那么对应的 if 语句会执行,于是我们就可以适当地处理它们。

3. 直接比较

第三种获取错误的更多信息的方式,是与 error 类型的变量直接比较。我们通过一个示例来理解。

filepath 包中的 Glob函数用于返回满足 glob 模式的所有文件名。如果模式写的不对,该函数会返回一个错误 ErrBadPattern。

filepath 包中的 ErrBadPattern 定义如下:

var ErrBadPattern = errors.New("syntax error in pattern")

errors.New() 用于创建一个新的错误。我们会在下一教程中详细讨论它。

当模式不正确时,Glob 函数会返回 ErrBadPattern。

我们来写一个小程序来看看这个错误。

package main

import (  
    "fmt"
    "path/filepath"
)

func main() {  
    files, error := filepath.Glob("[")
    if error != nil && error == filepath.ErrBadPattern {
        fmt.Println(error)
        return
    }
    fmt.Println("matched files", files)
}

在 playground 上运行

在上述程序里,我们查询了模式为 [ 的文件,然而这个模式写的不正确。我们检查了该错误是否为 nil。为了获取该错误的更多信息,我们在第 10 行将 error 直接与 filepath.ErrBadPattern 相比较。如果该条件满足,那么该错误就是由模式错误导致的。该程序会输出:

syntax error in pattern

标准库在提供错误的详细信息时,使用到了上述提到的三种方法。在下一教程里,我们会通过这些方法来创建我们自己的自定义错误。

不可忽略错误

绝不要忽略错误。忽视错误会带来问题。接下来我重写上面的示例,在列出所有满足模式的文件名时,我省略了错误处理的代码。

package main

import (  
    "fmt"
    "path/filepath"
)

func main() {  
    files, _ := filepath.Glob("[")
    fmt.Println("matched files", files)
}

在 playground 上运行

我们已经从前面的示例知道了这个模式是错误的。在第 9 行,通过使用 _ 空白标识符,我忽略了 Glob函数返回的错误。我在第 10 行简单打印了所有匹配的文件。该程序会输出:

matched files []

由于我忽略了错误,输出看起来就像是没有任何匹配了 glob 模式的文件,但实际上这是因为模式的写法不对。所以绝不要忽略错误。

本教程到此结束。

这一教程我们讨论了该如何处理程序中出现的错误,也讨论了如何查询关于错误的更多信息。简单概括一下本教程讨论的内容:

  • 什么是错误?
  • 错误的表示
  • 获取错误详细信息的各种方法
  • 不能忽视错误

在下一教程,我们会创建我们自己的自定义错误,并给标准错误增加更多的语境(Context)。

祝您愉快。

ps:新手翻译,欢迎大家指正!

Golang教程第31节--自定义错误

工程实践之Golang错误处理 1、原生错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error类型是一个接口类型,这是它的定义: type error interface { Error() string } ​ 我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息: func Sqrt(f float64) (float64, error) { if f < 0 { ... 阅读详情

相关推荐

golang超详细基础入门教程_golang教程

Go语言(或 Golang)起源于2007年,并在2009年正式对外发布。Go是非常年轻的一门语言,它的主要目标是"兼具Python等动态语言的开发速度和C/C++等编译型语言的性能与安全性"。Go语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go语言的设计理念是不损失应用程序性能的情况下降低代码的复杂性,旨在创造一种新的编程语言,既能够保持C和C++的效率,又能够拥有像Python和Ruby的灵活性和易读性。

m0_74825409的博客 1783

golang版微信小程序图片上传,服务器保存

golang版微信小程序图片上传,服务器保存 其实很简单,小程序那边调wx.uploadFile其实就是客户端发起一个 HTTPS POST 请求,其中 content-type 为 multipart/form-data,只不过以前是自己写接口,现在是由微信的api来调用. 怎么读取呢,你只需要读取FromFile表单中的内容就行了,go很简单不用框架,我为了方便开发用的gin file...

qq_27507377的博客 2653

Golang 错误处理

除了使用内置的error类型外,我们还可以自定义自己的错误类型,并编写相应的错误处理函数。这可以让我们更好地控制程序中的错误信息,并提供更好的用户体验。if err!= nil {return在这个例子中,我们定义了一个MyError结构体,它包含一个字符串类型的message字段,并实现了Error()方法。然后我们修改了divide函数,使其返回一个指向MyError结构体的指针。在main函数中,我们调用divide函数,并检查返回的error值是否为nil。

canduecho的专栏 1220

【pytho】request五种种请求处理为空和非空处理以及上传excel,上传图片处理

request.data,使用过JavaScript,api调用方式进行掺入json字符串,由于传入的是字符串,所有需要通过json.loads(request.data)进行加载成字典。request.form获取的也是个字典,所以也可以通过get方式获取请求的form参数和值。request.args获取的是个字典,所以可以通过get方式获取请求参数和值。request.json,获取的是个字典,所以特可以通过get方式获取。request.headers也是字典。

august_shi的专栏 1458

239号资源-simulink仿真:MATLAB/Simulink教程(PDF文档)-----已提供下载资源

电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。

LIANG674027206的博客 1076

Vivado实战:如何用BUFGMUX_CTRL实现FPGA双时钟热切换(附时序约束模板)

本文详细介绍了如何使用Xilinx FPGA中的BUFGMUX_CTRL原语实现双时钟热切换的工业级解决方案。通过分析BUFGMUX_CTRL的核心机制、PCB布局约束和电源噪声抑制方法,提供Vivado实现全流程和时序约束模板,帮助工程师在工业自动化、车载电子等场景中提升系统可靠性。

weixin_29186249的博客 577

Golang实践录:使用gin框架实现转发功能:上传文件并转

近段时间需要实现一个转发 post 请求到指定后端服务的小工具,由于一直想学习 gin 框架,所以就使用这个框架进行尝试,预计会产生几篇文章。本文先研究如何在 gin 框架中实现上传和转发功能。

李迟的专栏 2906

YOLOv5 改进点总览:轻量化、高精度的背后有哪些魔改?

YOLOv5是由Ultralytics团队开发的高效目标检测模型,其核心改进包括:主干网络采用CSPDarknet53提升梯度传播效率;特征融合使用PANet增强小目标识别;输出结构采用解耦头设计优化定位和分类任务。此外,YOLOv5通过CIoU损失函数、Mosaic数据增强和SimOTA标签分配机制进一步提升性能。模型支持多种推理格式(ONNX/TensorRT等),并具备自动锚框匹配和多尺度训练功能,使其在轻量化(yolov5s仅7MB)与高性能(最高51.2% mAP)间取得平衡,但缺乏正式论文支撑是

guoguozgw的博客 1806

Golang自定义DNS Nameserver

某些情况下我们希望程序通过自定义Nameserver去查询域名,而不希望通过操作系统给定的Nameserver,本文介绍如何在Golang中实现自定义Nameserver。 DNS解析过程 Golang中一般通过net.Resolver的LookupHost(ctx context.Context, host string) (addrs []string, err error)去实现域名解析,解析过程如下: 检查本地hosts文件是否存在解析记录,存在即返回解析地址 不存在即根据resolv.conf中

Qinng的博客 3246

Spring Boot与Apache Ignite集成:构建高性能分布式缓存和计算平台

Apache Ignite是一个高性能的分布式内存计算平台,支持内存缓存、分布式计算、流处理和机器学习等功能。它提供了低延迟的数据访问和强大的计算能力,适用于需要高性能和可扩展性的应用。将Apache Ignite集成到Spring Boot应用中,可以显著提高应用的性能和可扩展性。Spring Boot的简单配置和Ignite的强大功能相结合,使得开发和部署更加高效。首先,创建一个新的Spring Boot项目。可以通过Spring Initializr(https://start.spring.io/)

九天的专栏 2142

8、对比 LightGBM、XGBoost 和深度学习

本文对比了LightGBM、XGBoost和深度学习模型(特别是TabTransformer)在处理表格数据时的性能差异。从模型复杂度、数据准备、训练时间、准确性和适用场景等方面进行分析,重点探讨了三者在人口普查收入预测任务中的表现。文章详细介绍了XGBoost与LightGBM的核心特性与区别,深入讲解了TabTransformer的架构与实现,并涵盖了分类特征编码、缺失值处理和类别不平衡等关键数据预处理技术,为选择合适的表格数据建模方法提供了实践指导。

julia4scientist的博客 120

【Go系列】 Go的错误处理

你可以通过实现。

u013379032的博客 2018

组态王的日历时间控件脚本

日期时间控件中的脚本中在小于10的月份和天数前必须要加上0,这是由首字符对比机制规定的,首字母相同,就不再不做对比了,比如1和11,是一样的。首字母不同,再比较下一位。 float Ayear1; float Amonth1; float Aday1; string temp1; Ayear1=sd.Year; Amonth1=sd.Month; Aday1=sd.Day; temp1=StrFromInt( Ayear1, 10 ); if(Amonth1<10) temp1=temp1+"-0"+

逍遥子的博客 5718

go 调用其他文件函数_「GCTT 出品」Go 系列教程——30. 错误处理

Go语言中文网,致力于每日分享编码、开源等知识,欢迎关注我,会有意想不到的收获!Go 系列教程是非常棒的一套初学者教程,入门就它了。这是 Golang 系列教程中的第 30 篇。在本章教程中,我们将讨论 Go 语言中的错误处理。什么是错误?错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。在 Go 中,错误一直是很常见的。错...

weixin_39751871的博客 324

【Block总结】DiffAttention,差分注意力融入CLIP架构,抑制噪声,增强对相关特征的关注|即插即用

DiffCLIP通过微小的结构改动实现了显著的性能提升,为多模态模型的轻量化与高效化提供了新范式。

AI浩 1561

「企业级智能体」LangChain4j Multi-Agent:角色分离 + 协同编排实战

在大部分 Java 项目里,“接入大模型Controller 收到一个 question调用大模型接口拿到 answer把结果原样丢回前端这种玩法可以叫「高配搜索框模式一个 Agent 要写 Prompt、要查数据库、还要改写文案,太忙了不同角色(创作者、编辑、审稿人)的职责混在一起,难以维护想复用其中一段能力(比如只要润色)也不方便把大任务拆成多个 “角色清晰的 Agent”,再编排它们像流水线一样协同完成任务。CreativeWriter:负责创作故事。

OFFTime_we的博客 1548

【Golang学习之旅】Go 语言错误处理(error 接口、panic、recover)

✅ 适合人群:Golang 开发者 | 后端开发工程师 | 并发编程初学者✅ 文章亮点:深入解析 error、panic、recover + 代码示例 + 实战场景✅ 目标:掌握 Go 语言错误处理机制,编写健壮、高质量的 Go 代码!error🔹 Go 语言错误处理的基本原则:✅ 普通错误使用error处理(推荐方式)✅ 严重错误使用panic处理✅ 程序应尽可能优雅地恢复panic用于表示程序发生严重错误,无法继续执行,通常用于不可恢复的错误,如:✅ 数组越界✅ 空指针引用。

程序员林北北的博客 1278

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

golang中的错误处理机制

golang的错误处理机制是一种显式的方式,强调明确的错误检查和处理,而不依赖于异常机制。golang并没有采用传统的(如 Java 中的 try-catch 或 python 中的 try-except)机制,而是通过显式的返回值来报告和处理错误。Go 1.13 引入了 fmt.Errorf 的 %w 格式说明符,允许错误的“包装”,从而将原始错误附加到新错误上。golang 提倡显式的错误检查。在 Go 中,“尽早失败”是一个常见的错误处理原则,即在出现错误时,尽快返回错误,而不是继续执行后续代码。

网络风云的博客 5671

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

golang 错误处理

带你熟悉golang error相关的知识. 0.引言 在这篇文章中,我会带你熟悉golang error相关的知识,大概内容如下: golang error和其他语言的对比,好处与弊端golang 中各种类型的错误以及推荐的错误类型如何处理错误对go1.13的错误包进行解析对golang error相关知识进行总结、梳理思考题 如果本文中有任何的错误、或者你有一些好的想法都可以及时的提出,希望我们共同进步。 注:本文中的所有代码都在:https://github.com/driftingboy/ad

qq_40653180的博客 5376

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

17 go语言(golang) - 错误处理

error使用errors.New或创建简单的文本描述性错误。err1 := errors.New("自定义错误1")err2 := fmt.Errorf("自定义错误2")输出自定义错误1自定义错误2如果需要更复杂或结构化的信息,可以定义自己的类型并实现Error()方法。code intmsg string404,"自定义错误!",输出code:404,msg:自定义错误!{404 自定义错误!

瑞瑞的博客 1189

谈谈golang的错误处理

Go语言的错误处理机制随着开发者对问题理解的深入而逐步演变。通过合理使用error接口、错误封装、链式错误处理等,开发者可以构建出更加健壮和易于维护的Golang程序。

sc35262的博客 1142

30天学会Go--第4天 GO语言 错误处理与文件操作

在 Go 语言中,错误处理和文件操作是编写健壮程序的重要组成部分。Go 提供了简洁而强大的错误处理机制,以及丰富的标准库支持文件的读写操作。本节将通过理论与实践相结合的方式,带你快速掌握这两个关键主题。go语言的官方文档学习笔记很全,推荐去官网学习30天学会Go–第3天 GO语言 并发编程-优快云博客Go 允许我们通过实现error接口自定义错误类型,便于更灵活地处理错误。Go 的错误处理机制,包括基本错误处理、自定义错误、panic和recover。

Xiao651的博客 1375

golang学习笔记13——golang的错误处理深度剖析

在某些情况下,可以使用自定义错误类型来表示特定的错误情况。自定义错误类型可以提供更多的错误信息,方便调试和排查问题。Golang 中的错误处理是一个非常重要的方面,它直接影响到程序的稳定性和可靠性。通过显式的错误处理方式,Golang 使得错误处理代码与正常的业务逻辑代码分离,更加清晰易读。在实际开发中,我们应该遵循错误处理的最佳实践,尽早处理错误,提供详细的错误信息,避免忽略错误,使用自定义错误类型,并进行错误日志记录。这样可以提高程序的稳定性和可靠性,减少潜在的错误和问题。关注我看更多有意思的文章哦!

GoppViper的博客 1888

【Go】Go 错误处理

文章目录一、错误处理二、实例参考链接 一、错误处理 Go 语言通过内置的错误接口提供了非常简单的错误处理机制。 error 类型 是一个 接口 类型,这是它的定义: //error 接口内有一个返回字符串的方法Error() type error interface { Error() string } 我们可以在编码中通过实现 error 接口类型来生成错误信息。 函数通常在最后的返回值中返回错误信息。 如,使用errors.New 可返回一个错误信息: func Sqrt(f float64

weixin_44211968的博客 1751

Golang —— 错误处理方案

Golang漂亮的错误处理规范也是Go语言的最大亮点之一。 error接口 标准库把error定义为接口类型, 以便于自己定义错误类型 type error interface{ Error() string } error的使用也比较简单 // error对象的两种创建方式 // 1.使用fmt.Errorf //var err1 error = fmt.Errorf("%s", "this is normal error") err1 := fmt.Errorf("%s", "this

qq_45914985的博客 851
上一篇: Golang教程第29节--defer
下一篇: Golang教程第31节--自定义错误
cbmljs
博客等级 码龄10年 329粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值