错误处理机制:

先看一段代码:看看输出什么?

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错误处理机制及自定义错误的更多相关文章

  1. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  2. ASP.NET的错误处理机制之一(概念)

    对Web应用程序来说,发生不可预知的错误和异常在所难免,我们必须为Web程序提供错误处理机制.当错误发生时,我们必须做好两件事情:一是将错误信息记录日志,发邮件通知网站维护人员,方便技术人员对错误进行 ...

  3. PHP中的错误处理机制

    常见的三种错误: 1.Notice :通知性错误,最小的错误,当发生通知性错误时,会弹出一个提示信息.不会中断代码的执行. 错误代码: #例如Notice: 2.Warning:警告性错误,当发生警告 ...

  4. WebApi实现自定义错误日志

    一.Mvc错误处理默认有添加HandleErrorAttribute默认的过滤器,但是我们有可能要捕捉这个错误并记录系统日志那么这个过滤器就不够用了,所以我们要自定义Mvc及Web Api各自的错误处 ...

  5. 自定义错误信息并写入到Elmah

    在ap.net Web项目中一直使用Elmah进行日志记录, 但一直有一个问题困扰我很久,那就是我如何自己生成一个错误并记录到Elmah里去. 你知道有时你需要在项目中生成一个错误用于一些特殊的需求 ...

  6. MVC4 自定义错误页面(转)

    一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...

  7. javascript中的错误处理机制

    × 目录 [1]对象 [2]类型 [3]事件[4]throw[5]try[6]常见错误 前面的话 错误处理对于web应用程序开发至关重要,不能提前预测到可能发生的错误,不能提前采取恢复策略,可能导致较 ...

  8. MVC4 自定义错误页面(三)

    一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...

  9. PHP 错误处理机制

    在日常的项目开发过程中,总是会出现一些我们意想不到的异常错误,如果我们对此没有进行相对完善的处理,那么程序看上去也很不专业,也很可能就会成为别人攻击系统的有效信息:有些错误异常会终止脚本执行,这个时候 ...

随机推荐

  1. 攻防世界--key

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/c6cf449ae4b7498eba5027c533386a40.exe 1.准备 获取 ...

  2. 帝国CMS 列表内容模板[!--empirenews.listtemp--]改写为灵动标签[e:loop={}]

    需求描述: 1.将专题列表下的列表单元,自动根据专题页标题或者页面关键词来匹配展示: 2.第一个精确匹配,后面十一个模糊匹配,总数12个: 正文模板中,引入部分为: [!--empirenews.li ...

  3. IIS环境下PHP版本过低无法Sql查询的解决

    需求:帝国后台添加个后台框,输入地址,原页面重写成所指链接页面 重点:当输入框输入地址,提交到后台后,打开原链接,该页面会读取php文件GetUrlPage.php <?php header(& ...

  4. linux命令截取文件最后n行(所有命令)

    linux命令截取文件最后n行(所有命令) tail -n a.txt > b.txt 联想:系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) una ...

  5. keepalived的配置文件

    ! Configuration File for keepalived global_defs { notification_email { # acassen@firewall.loc # fail ...

  6. Codeforces Round #425 (Div. 2) - A

    题目链接:http://codeforces.com/contest/832/problem/A 题意:有n个棍子,两个人轮流取这些棍子,每个人每次只能去恰好k个棍子(不足k个则不能取),问先手取的棍 ...

  7. file 显示文件的类型

    1. 命令功能 file命令是确定文件类型,也可以辨识一些文件的编码格式.通过文件的头部信息来获取文件类型.windows是通过扩展名来确定文件类型. 2. 语法格式 file  [option]  ...

  8. JS基础入门篇(七)—运算符

    1.算术运算符 1.算术运算符 算术运算符:+ ,- ,* ,/ ,%(取余) ,++ ,-- . 重点:++和--前置和后置的区别. 1.1 前置 ++ 和 后置 ++ 前置++:先自增值,再使用值 ...

  9. 网络安全专家教你设置史上最安全的WiFi密码

    通过设置强密码可以防止WiFi被蹭网现象的发生,保证WiFi网络安全.那么我们的WiFi密码怎么设置才最安全呢? 提供以下设置建议: 1.WiFi密码设置尽量使用字母.数字和字符组成的密码.这种密码强 ...

  10. Spring---数据访问

    1.Spring Data概述 1.1.Spring Data 项目 是  Spring用来解决数据访问问题   的一站式解决方案,包含了  大量关系型数据库.非关系型数据库  的  数据访问解决方案 ...