Go错误处理机制及自定义错误
错误处理机制:
先看一段代码:看看输出什么?
package main
import "fmt"
func test() {
      num1 := 10
      num2 := 0
      res := num1 / num2
      fmt.Println("res=",res)
}
func main() {
      test()
      fmt.Println("下面的代码和逻辑...")
}
对上面代码的总结:
1)在默认情况下,当发生错误后(panic),程序就会退出(崩溃了)
2)如果我们希望,当发生错误后,可以捕获到错误,保证程序可以继续执行。还可以在捕获到错误后,给管理员一个提示(邮件,短信...)
3)这里引出我们要讲的错误处理机制
基本说明:
1)Go语言追求简洁优雅,所以,Go语言不支持传统的 try...catch...finally 这种处理
2)Go中引入的处理方式为: defer, panic, recover
3)这几个异常的使用场景可以这么简单描述:Go中可以抛出一个panic的异常,然后在defer 中通过 recover (内置函数) 捕获这个异常,然后正常处理
针对上面的错误代码进行处理: 使用defer 和 recover 来处理错误
func test() {
	  //使用defer + recover 来捕获和处理异常
	  defer func () {
		    //err := recover() //recover()内置函数,可以捕获异常
		    if err := recover(); err != nil { //说明捕获到错误
			      fmt.Println("err=", err)
			      //这里就可将错误信息发送给管理员
			      fmt.Println("发送邮件给admin@sohu.com")
		    }
	  }()
      num1 := 10
      num2 := 0
      res := num1 / num2
      fmt.Println("res=",res)
}
func main() {
      test()
	  for {
		    fmt.Println("main()下面的代码和逻辑...")
		    time.Sleep(time.Second)
	  }
}

错误处理的好处:
进行错误处理后,程序不会轻易挂掉,如果加入预警代码,就可以让程序更加的健壮。
自定义错误:
Go程序中,也支持自定义错误,使用errors.New 和 panic 内置函数。
  1)errors.New("错误说明"),会返回一个error类型的值,表示一个错误
  2)panic内置函数,接受一个interface{}类型的值(也就是任何值了) 作为参数。可以接受error类型的变量,输出错误信息,并退出程序。
案例演示:
package main
import (
	  "fmt"
	  "errors"
)
//函数去读取一配置文件init.conf的信息
//如果文件名传入不正确,我们就返回一个自定义的错误
func readConf(name string) (err error) {
	  if name == "config.ini" {
		    //读取...
		    return nil
	  } else {
		    //返回一个自定义错误
		    return errors.New("读取文件错误...")
	  }
}
func test02() {
	  err := readConf("config2.ini")
	  if err != nil {
		    //如果读取文件发生错误,就输出这个错误,并终止程序
		    panic(err)
	  }
	  fmt.Println("test02()继续执行...")
}
func main() {
	  test02()
	  fmt.Println("test02()继续执行...")
}

Go错误处理机制及自定义错误的更多相关文章
- C#不用union,而是有更好的方式实现    .net自定义错误页面实现    .net自定义错误页面实现升级篇  .net捕捉全局未处理异常的3种方式  一款很不错的FLASH时种插件  关于c#中委托使用小结  WEB网站常见受攻击方式及解决办法  判断URL是否存在  提升高并发量服务器性能解决思路
		C#不用union,而是有更好的方式实现 用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ... 
- ASP.NET的错误处理机制之一(概念)
		对Web应用程序来说,发生不可预知的错误和异常在所难免,我们必须为Web程序提供错误处理机制.当错误发生时,我们必须做好两件事情:一是将错误信息记录日志,发邮件通知网站维护人员,方便技术人员对错误进行 ... 
- PHP中的错误处理机制
		常见的三种错误: 1.Notice :通知性错误,最小的错误,当发生通知性错误时,会弹出一个提示信息.不会中断代码的执行. 错误代码: #例如Notice: 2.Warning:警告性错误,当发生警告 ... 
- WebApi实现自定义错误日志
		一.Mvc错误处理默认有添加HandleErrorAttribute默认的过滤器,但是我们有可能要捕捉这个错误并记录系统日志那么这个过滤器就不够用了,所以我们要自定义Mvc及Web Api各自的错误处 ... 
- 自定义错误信息并写入到Elmah
		在ap.net Web项目中一直使用Elmah进行日志记录, 但一直有一个问题困扰我很久,那就是我如何自己生成一个错误并记录到Elmah里去. 你知道有时你需要在项目中生成一个错误用于一些特殊的需求 ... 
- MVC4 自定义错误页面(转)
		一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ... 
- javascript中的错误处理机制
		× 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ... 
- MVC4 自定义错误页面(三)
		一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ... 
- PHP 错误处理机制
		在日常的项目开发过程中,总是会出现一些我们意想不到的异常错误,如果我们对此没有进行相对完善的处理,那么程序看上去也很不专业,也很可能就会成为别人攻击系统的有效信息:有些错误异常会终止脚本执行,这个时候 ... 
随机推荐
- 【JAVA】格式化打印printf的使用
			格式化打印printf的使用 import java.util.Date; /** * 使用printf输出 */ /**关键技术点 * 使用java.io.PrintStream的printf方法实 ... 
- ASE Beta Sprint - backend scrum 4
			本次scrum于2019.12.10在sky garden进行,持续10分钟. 参与人: Xin Kang, Zhikai Chen, Lihao Ran, Hao Wang 请假: Ning Jia ... 
- 去除重复嵌套的html标签函数
			去除重复嵌套的html标签 function strip_multi_tags($str, $tag = 'div'){ preg_match_all('/<'.$tag.'>|<\ ... 
- ORM和JDBC
			为什么要用 ORM? 和 JDBC有何不一样? ORM(Object-Relational Mapping),对象关系映射,是一种思想,就是把Object转变成数据库中的记录,或者把数据库中的记录转变 ... 
- 容器(collection)初步
			容器(集合)的分类: 泛型(generic):本质是数据类型的参数化(提前告诉编译器,在调用泛型时必须传入实际类型) 例:E即为在主函数中定义的传入的实际类型 class MyCollection&l ... 
- RMQ Fanout
			原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11795256.html RMQ Fanout Project Directory Maven Depe ... 
- 用jquery实现图片轮播
			用jquery简单实现图片轮播效果,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta ... 
- [NOIP2016][luogu]换教室[DP]
			[NOIP2016] Day1 T3 换教室 ——!x^n+y^n=z^n 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n 节课程 ... 
- 20180813-Java 重写(Override)与重载(Overload)
			Java 重写(Override)与重载(Overload) class Animal{ public void move(){ System.out.println("动物可以移动&quo ... 
- spring mvc中的@Entity是什么意思?
			@Entitypublic Class JavaBean{}标注该类为实体类. 
