Go 语言.net的错误处理机制制是一个优秀的设计吗

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
傻丫头和高科技产物小心翼翼的初恋
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
个人大数据技术博客:
人生得意须尽欢,莫使金樽空对月。
作者: 翻译:王嘉怡 责编:仲培艺
Go语言从面世就受到了业界的普遍关注,曾有文章分析,Go是最有可能改变未来IT技术的十大语言之一。本文作者列举了Go语言的设计模式和成例合集,并且还进行了详细的分类。创建型模式
抽象工厂模式:提供一个接口用于创建相关对象的家族;
Builder模式:使用简单的对象来构建复杂的对象;
工厂方法模式:一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中;
对象池模式:实例化并维护一组相同类型的对象实例;
单例模式:限制类的实例,保证一个类只有一个实例。
适配器模式:适配另一个不兼容的接口来一起工作;
桥接模式:将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化;
合成模式:将对象组织到树中,用来描述树的关系;
装饰模式:给一个静态或动态对象添加行为;
门面(Facade)模式:为子系统中的各类(或结构与方法)提供一个简明一致的界面,隐藏子系统的复杂性,使子系统更加容易使用;
Flyweight模式:运用共享技术有效地支持大量细粒度的对象;
MVC模式:是模型(model)-视图(view)-控制器(controller)的缩写,将一个应用程序划分成三个相互关联的部分,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系;
命令模式:就是客户端发布一个命令(也就是“请求”),而这个命令已经被封装成一个对象。即这个命令对象的内部可能已经指定了该命令具体由谁负责执行;
中介(Mediator)模式:用一个中介对象来封装一系列关于对象交互行为;
观察者模式:对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新;
注册(Registry)模式:跟踪给定类的所有子类;
状态模式:基于一个对象的内部状态,给相同对象提供多种行为;
策略模式:定义一系列算法,并将每一个算法封装起来,而且使它们可以相互替换;
模板(Template)模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤;
访问者模式:表示一个作用于某对象结构中的各元素的操作,它使开发者可以在不改变各元素类的前提下定义作用于这些元素的新操作。
条件变量:利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待”条件变量的条件成立”而挂起;另一个线程使”条件成立”(给出条件成立信号);
Lock/Mutex:执行互斥限制资源获得独占访问;
监视器模式:互斥锁和条件变量的组合模式;
读写锁定模式:它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作;
Semaphore:负责协调各个线程,以保证它们能够正确、合理地使用公共资源。
Bounded Parallelism:完成大量资源限制的独立任务;
广播(Broadcast):把一个消息同时传输到所有接收端;
协同(Coroutines):允许在特定地方暂停和继续执行的子程序;
生成器:一次性生成一系列值;
Reactor模式:在事件驱动的应用中,将一个或多个客户的服务请求分离(demultiplex)和调度(dispatch)给应用程序。同步、有序地处理同时接收的多个服务请求。
并行(Parallelism):完成大量的独立任务;
生产者消费者:从任务执行中分离任务;
调度器(Scheduler):协调任务步骤。
消息传递模式
扇入(Fan-In):该模块直接调用上级模块的个数,像漏斗型一样去工作;
扇出(Fan-Out):该模块直接调用的下级模块的个数;
Futures & Promises:扮演一个占位角色,对未知的结果用于同步;
Publish/Subscribe:将信息传递给订阅者;
Push & Pull:把一个管道上的消息分发给多人。
Bulkheads:实施故障遏制原则,例如防止级联故障;
断路器(Circuit-Breaker)模式:当请求有可能失败时,停止流动的请求;
截止日期(Deadline):一旦响应变缓,允许客户端停止一个正在等待的响应;
Fail-Fast机制:集合的一种错误检测机制。当多个线程对集合进行结构上的改变操作时,有可能会产生fail-fast机制;
Handshaking:如果一个组件的不能访问请求被拒绝,询问是否还能承担更多负载;
稳定状态(Steady-State):为每一个服务积累一个资源,其它服务必须回收这些资源;
Timing Functions:包装和执行日志的函数;
Functional Options:允许给默认值创建clean API和惯用重载;
级联故障:一个系统的某部分出现错误,与之有关的上下级也随之出现故障,导致多米诺效应。
日-23日,[SDCC 2016大数据技术&架构实战峰会]( /)将在杭州举行,两场峰会大牛讲师来自阿里、京东、苏宁、唯品会、美团点评、游族、饿了么、有赞、Echo等知名互联网公司,共同探讨海量数据下的应用监控系统建设、异常检测的算法和实现、大数据基础架构实践、敏捷型数据平台的构建及应用、音频分析的机器学习算法应用,以及高可用/高并发/高性能系统架构设计、电商架构、分布式架构等话题与技术。
9月5日~18日是八折优惠票价阶段,5人以上团购或者购买两场峰会通票更有特惠,限时折扣,预购从速。()。Go语言中错误处理实例分析
作者:不是JS
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Go语言中错误处理,实例分析了Go语言中针对错误处理的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了Go语言中错误处理的方法。分享给大家供大家参考。具体分析如下:
错误是可以用字符串描述自己的任何东西。 主要思路是由预定义的内建接口类型 error,和其返回返回字符串窜的方法 Error 构成。
type error interface {
Error() string
当用 fmt 包的多种不同的打印函数输出一个 error 时,会自动的调用该方法。
代码如下:package main
&&& "time"
type MyError struct {
&&& When time.Time
&&& What string
func (e *MyError) Error() string {
&&& return fmt.Sprintf("at %v, %s",
&&&&&&& e.When, e.What)
func run() error {
&&& return &MyError{
&&&&&&& time.Now(),
&&&&&&& "it didn't work",
func main() {
&&& if err := run(); err != nil {
&&&&&&& fmt.Println(err)
希望本文所述对大家的Go语言程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Go语言的有效错误处理
- Go语言中文网 - Golang中文社区
<meta name="author" content="polaris ">
Go语言的有效错误处理
· 3527 次点击 ·
开始浏览 & &
中午闲暇翻看的“”时,发现其另外一篇短文“”,文章不长,但感觉对中错误处理方法总结的还是比较到位的,这里译之供大家参考。
Go语言受到诟病最多的一项就是其错误处理机制。如果显式地检查和处理每个error,这恐怕的确会让人望而却步。你可以试试这里列出的几个方法,以避免你走入错误处理方法的误区当中去。
二、在缩进区处理错误
当使用Go语言编写代码时,首选下面这样的错误处理方法:
f, err := os.Open(path)
if err != nil {
// handle error
// do stuff
而不是下面这样的:
f, err := os.Open(path)
if err == nil {
// do stuff
// handle error
按照上面的方法处理错误,处理正常情况的代码读起来就显得通篇连贯了。
三、定义你自己的errors
做好如何正确进行错误处理的第一步就是要了解error是什么。如果你设计实现的包会因某种原因发生某种错误,你的包用户将会对错误的原因很感兴趣。为了满足用户的需求,你需要实现error接口,简单做起来就像这样:
type Error string
func (e Error) Error() string { return string(e) }
现在,你的包用户通过执行一个type assertion就可以知道是否是你的包导致了这个错误:
result, err := yourpackage.Foo()
if ype, ok := err.(yourpackage.Error); ok {
// use ype to handle error
通过这个方法,你还可以向你的包用户暴露更多地结构化错误信息:
type ParseError struct {
Error string
func (oe *ParseError) Error() string {//译注:原文中这里是OpenError
// format error string here
func ParseFiles(files []*File) error {
for _, f := range files {
err := f.parse()
if err != nil {
return &ParseError{ //译注:原文中这里是OpenError
Error: err.Error(),
通过这种方法,你的用户就可以明确地知道到底哪个文件出现解析错误了。(译注:从这里看到的go语言error设计之内涵,让我想起了Rob Pike大神的一篇Blog:"")
不过包装error时要小心,当你将一个error包装起来后,你可能会丢失一些信息:
var c net.Conn
f, err := DownloadFile(c, path)
switch e := err.(type) {
// this will get executed if err == nil
case net.Error:
// close connection, not valid anymore
case error:
// if err is non-nil
return err
// do other things.
如果你包装了net.Error,上面这段代码将无法知道是由于网络问题导致的失败,会继续使用这条无效的链接。
有一条经验规则:如果你的包中使用了一个外部interface,那么不要对这个接口中方法返回的任何错误,使用你的包的用户可能更关心这些错误,而不是你包装后的错误。
四、将错误作为状态
有时,当遇到一个错误时,你可能会停下来等等。这或是因为你将延迟报告错误,又或是因为你知道如果这次报告后,后续你会再报告同样的错误。
第一种情况的一个例子就是bufio包。当一个bufio.Reader遇到一个错误时,它将停下来保持这个状态,直到buffer已经被清空。只有在那时它才会报告错误。
第二种情况的一个例子是go/loader。当你通过某些参数调用它导致错误时,它会停下来保持这个状态,因为它知道你很可能会使用同样地参数再次调用它。
五、使用函数以避免重复代码
如果你有两段重复的错误处理代码,你可以将它们放到一个函数中去:
func handleError(c net.Conn, err error) {
// repeated error handling
func DoStuff(c net.Conn) error {
f, err := downloadFile(c, path)
if err != nil {
handleError(c, err)
return err
f, err := doOtherThing(c)
if err != nil {
handleError(c, err)
return err
优化后的实现方法如下:
func handleError(c net.Conn, err error) {
if err == nil {
// repeated error handling
func DoStuff(c net.Conn) error {
defer func() { handleError(c, err) }()
f, err := downloadFile(c, path)
if err != nil {
return err
f, err := doOtherThing(c)
if err != nil {
return err
这就是全部了。就Go语言错误处理而言,我知道的就这么多了。
(C) 2014, . 版权所有.
3527 次点击 &
请尽量让自己的回复能够对别人有帮助
支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
支持 @ 本站用户;支持表情(输入 : 提示),见
记住登录状态
中午闲暇翻看的“”时,发现其另外一篇短文“”,文章不长,但感觉对中错误处理方法总结的还是比较到位的,这里译之供大家参考。
Go语言受到诟病最多的一项就是其错误处理机制。如果显式地检查和处理每个error,这恐怕的确会让人望而却步。你可以试试这里列出的几个方法,以避免你走入错误处理方法的误区当中去。
二、在缩进区处理错误
当使用Go语言编写代码时,首选下面这样的错误处理方法:
f, err := os.Open(path)
if err != nil {
// handle error
// do stuff
而不是下面这样的:
f, err := os.Open(path)
if err == nil {
// do stuff
// handle error
按照上面的方法处理错误,处理正常情况的代码读起来就显得通篇连贯了。
三、定义你自己的errors
做好如何正确进行错误处理的第一步就是要了解error是什么。如果你设计实现的包会因某种原因发生某种错误,你的包用户将会对错误的原因很感兴趣。为了满足用户的需求,你需要实现error接口,简单做起来就像这样:
type Error string
func (e Error) Error() string { return string(e) }
现在,你的包用户通过执行一个type assertion就可以知道是否是你的包导致了这个错误:
result, err := yourpackage.Foo()
if ype, ok := err.(yourpackage.Error); ok {
// use ype to handle error
通过这个方法,你还可以向你的包用户暴露更多地结构化错误信息:
type ParseError struct {
Error string
func (oe *ParseError) Error() string {//译注:原文中这里是OpenError
// format error string here
func ParseFiles(files []*File) error {
for _, f := range files {
err := f.parse()
if err != nil {
return &ParseError{ //译注:原文中这里是OpenError
Error: err.Error(),
通过这种方法,你的用户就可以明确地知道到底哪个文件出现解析错误了。(译注:从这里看到的go语言error设计之内涵,让我想起了Rob Pike大神的一篇Blog:"")
不过包装error时要小心,当你将一个error包装起来后,你可能会丢失一些信息:
var c net.Conn
f, err := DownloadFile(c, path)
switch e := err.(type) {
// this will get executed if err == nil
case net.Error:
// close connection, not valid anymore
case error:
// if err is non-nil
return err
// do other things.
如果你包装了net.Error,上面这段代码将无法知道是由于网络问题导致的失败,会继续使用这条无效的链接。
有一条经验规则:如果你的包中使用了一个外部interface,那么不要对这个接口中方法返回的任何错误,使用你的包的用户可能更关心这些错误,而不是你包装后的错误。
四、将错误作为状态
有时,当遇到一个错误时,你可能会停下来等等。这或是因为你将延迟报告错误,又或是因为你知道如果这次报告后,后续你会再报告同样的错误。
第一种情况的一个例子就是bufio包。当一个bufio.Reader遇到一个错误时,它将停下来保持这个状态,直到buffer已经被清空。只有在那时它才会报告错误。
第二种情况的一个例子是go/loader。当你通过某些参数调用它导致错误时,它会停下来保持这个状态,因为它知道你很可能会使用同样地参数再次调用它。
五、使用函数以避免重复代码
如果你有两段重复的错误处理代码,你可以将它们放到一个函数中去:
func handleError(c net.Conn, err error) {
// repeated error handling
func DoStuff(c net.Conn) error {
f, err := downloadFile(c, path)
if err != nil {
handleError(c, err)
return err
f, err := doOtherThing(c)
if err != nil {
handleError(c, err)
return err
优化后的实现方法如下:
func handleError(c net.Conn, err error) {
if err == nil {
// repeated error handling
func DoStuff(c net.Conn) error {
defer func() { handleError(c, err) }()
f, err := downloadFile(c, path)
if err != nil {
return err
f, err := doOtherThing(c)
if err != nil {
return err
这就是全部了。就Go语言错误处理而言,我知道的就这么多了。
(C) 2014, . 版权所有.
1024 人在线
&最高记录 1223
&2012- Go语言中文网,中国 Golang 社区,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。
Powered by
&o&服务器由
赞助 &·&CDN 由
VERSION: V3.0.0&·&4.037165ms&·&为了更好的体验,本站推荐使用 Chrome 或 Firefox 浏览器
登录和大家一起探讨吧
记住登录状态
还不是会员GO语言程序设计_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
GO语言程序设计
上传于|0|0|文档简介
&&- 为什么我们需要一门新语言
- Go 语言的前世今生
- Hello world
- Go 特性介绍
- Go 基本数据类型
- 控制语句
- 错误处理
- 面向对象
- Goroutines
- Channels
- Timeouts
- Non-Blocking Channel
- 文件操作
- 编写命令行工具
- Web 编程
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩50页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 struts2错误处理机制 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信