用过go的都知道,go的error实现很简单,errors.New实现的error类并不存储堆栈数据,这导致一个问题,就是多次error return后,或panic后recover了,找不到触发异常的位置,这导致问题排查进一步很难定位.stackError实现类似于 java中的exception类,里面可以存储堆栈数据,并且通过单向链表记录error的触发嵌套关系,使日志追踪变的更加容易! 1.stackError的引用 go get 获取 go get github.com/lingdor…
错误现象 几周前,突然发现我的go 项目编译开始报一种以前从来没有出现过的错误: # runtime/cgo clang: warning: argument unused during compilation: '-pthread' # runtime/cgo clang: error: no such file or directory: 'libgcc.a' 需要说明下:我的开发机器是mac mini,系统当时是10.8.5, 上周升级为mavericks. 问题进一步探索 刚出现时我有点…
Golang tcp 转发 第一版本 accept获取的Conn里的localAddr做为源地址,remoteAddr来做为目的地址 // tcpForward package main import ( "fmt" "net" "os" ) func TcpForward(port int) { lisPort := fmt.Sprint(":", port) listen, err := net.Listen("…
函数经常会返回多种错误,这对终端用户来说可能会很有趣,但对程序而言,这使得情况变得复杂.很多时候,程序必须根据错误类型,作出不同的响应.让我们考虑这样一个例子:从文件中读取n个字节.如果n等于文件的长度,读取过程的任何错误都表示失败.如果n小于文件的长度,调用者会重复的读取固定大小的数据直到文件结束.这会导致调用者必须分别处理由文件结束引起的各种错误.基于这样的原因,io包保证任何由文件结束引起的读取失败都返回同一个错误——io.EOF,该错误在io包中定义: package io import…
check reject details on records of AP_SUPPLIER_INT SELECT s.parent_table,s.reject_lookup_code,S.LAST_UPDATE_DATE,F.MESSAGE_TEXT,F.DESCRIPTION FROM ap_supplier_int_rejections s, fnd_new_messages f WHERE s.reject_lookup_code = f.message_name AND s.pare…
如果使用的开发IDE是goland,那么 打开 FILE -> setting -> Go Modules 选项 ,在proxy 选项上填写 "https://goproxy.io" 说明:(go 1.11以上版本,不包含双引号)…
开发服务器程序时如果未经过充分测试, 服务稳定运行一段时间后会突然崩溃退出.一般是因为程序中出现了某个未捕获的异常. 这类问题属于偶现的,且需要服务器运行一段时间之后才会出现,难以定位有问题的代码段. 这中情况下应该将服务进程的stderr重定向至某个文件,这样当进程因未捕获的异常导致崩溃时,go运行时会将异常发生时各个协程的调用栈信息记录下来,便于定位问题. logFile, err := os.OpenFile("./log/fatal.log", os.O_CREATE|os.O…
在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们是把自己实现IErrorHandler接口的类型添加到ChannelDispatcher中的,也就是说,IErrorHandler处理的是通道层的错误,它可以捕捉到多个服务操作上发生的错误.而错误协定是面向协定层的,它是通过 FaultContractAttribute 来声明的,这个特性在上一篇文…
普通函数定义 √ golang函数基本组成:关键字func.函数名.参数列表.返回值.函数体和返回语句. • 语法如下 func 函数名(参数列表) (返回值列表) { // 函数体 } • 示例如下 package main import "fmt" import "errors" func Add(a int, b int) (ret int, err error) { || b < { // 假定只支持两个非负数字的加法 err = errors.New…
安装问题 在import sqlite的时候,golang build 出现以下错误, exec: "gcc": executable file not found in %PATH% 原因是sqlitle3是个cgo库,需要gcd编译c代码 然后下载安装tdm-gcc即可(windosw版本)下载地址:http://tdm-gcc.tdragon.net/download 在golang中使用sqlite3 ````js package main import ( "dat…