登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [golang]check_error.go 检测并打印错误,以免程序直接退出     [回主站]     [分站链接]
标题
[golang]check_error.go 检测并打印错误,以免程序直接退出
clq
浏览(135) + 2018-07-21 13:14:03 发表 编辑

关键字:

[2019-05-21 21:06:31 最后更新]
[golang]check_error.go 检测并打印错误,以免程序直接退出

这是 golang 中一个非常强的功能,也是它超越 C 语言的一个重要一项。就是在程序出错时不是直接退出,而是允许拦截错误后让程序继续执行。
不过在别的语言里实现很简单,一般都是 try 了 事。而 golang 里则繁琐得多,这个文件的功能就是让您在比较危险的函数之前只调用一句话即可避免异常时程序直接退出.
--------------------------------------------------
// 实现 try except 的异常捕捉, golang 有个好处,同一包的的代码可以放在多个文件中
package main

import (
//    "strconv"
//    "reflect"
//    "database/sql"
    "fmt"
//    "container/list"

    //_ "github.com/bmizerany/pq"
    //_"github.com/lib/pq" //驱动的写法一定要这样写,否则会当做无效的导入
)

func CheckErr(err error) {
    if err != nil {
        panic(err)  //相当于抛出一个异常,没有这个代码的话就不知道是什么错误了
    }
}//


func PrintError(funcName string){ // 必须要先声明defer,否则不能捕获到panic异常

    //fmt.Println("c")

    if err:=recover();err!=nil{

        fmt.Print("err:[" + funcName + "]");
        fmt.Println(err) // 这里的err其实就是panic传入的内容,55

    }

    //fmt.Println("d")

}//

func SprintError_v1(funcName string) string{ // 必须要先声明defer,否则不能捕获到panic异常

    //fmt.Println("c")
    r := "";

    if err:=recover();err!=nil{

        r = r + fmt.Sprint("err:[" + funcName + "]");
        r = r + fmt.Sprintln(err) // 这里的err其实就是panic传入的内容,55

    }

    //fmt.Println("d")

    return r;

}//

//recover 只能用在 defer 的函数中,只能在这一层的函数中调用 recover, 这是 golang 规定的,再调用别的函数里的 recover 是无效的
func SprintError(funcName string, outs * string){ // 必须要先声明defer,否则不能捕获到panic异常

    //defer PrintError("hmysql.PrintError");

    //fmt.Println("aaa");
    //s := SprintError(funcName); //这里面的 recover 是无效的,只能在这一层的函数中调用 recover, 这是 golang 规定的
   
    //fmt.Print(s);
   
    //self.Error += s;
   
    //fmt.Println("bbb");
   
    s := "";
   
    if err:=recover();err!=nil{

        s += fmt.Sprint("err:[" + funcName + "]");
        s += fmt.Sprintln(err) // 这里的err其实就是panic传入的内容,55
       
        //fmt.Println(err) // 这里的err其实就是panic传入的内容,55
        fmt.Println(s); // 这里的err其实就是panic传入的内容,55
       
       
        *outs = s;
    }   
   
    //fmt.Println("ccc");

}//

//示例
////取一个数据结果集
//func (self * HMysql) Query() {
//   
//    //--------------------------------------------------
//    //异常处理要先写
//    defer PrintError("HMysql.Query"); //因为 golang 是自动释放的,所以实际上可以用一个公用的错误输出,大多数时候不需要另外处理
//   
//    defer fmt.Println("有资源要释放,写在这里");
//
//    //--------------------------------------------------
//    db, err := sql.Open("postgres", "host=127.0.0.1 user=postgres password=postgres dbname=postgres sslmode=disable")
//
//    self.checkErr(err)
//
//
//
//}//






总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1