最近接手一个项目,有部分是用golang写的。这些代码的入口是一个main方法,一个很明显的问题就是,程序内部出现异常就崩溃,虽然在main方法中添加了defer,recover还是无济于事。golang有没有类似java中的异常处理方式吗?
更多评论
<a href="/user/Dust90" title="@Dust90">@Dust90</a> 可以给个demo看下吗?我发现在方法内有协程的情况下,在main无法捕获到异常
#2
process.go
````golang
package process
// 声明处理接口
type Process interface {
ProcessData(entrys []protocol.Entry)
}
// 声明处理函数
type DppProcess func(entrys []protocol.Entry)
// DppProcess 实现处理接口
func (dpp DppProcess) ProcessData(entrys []protocol.Entry) {
dpp(entrys)
}
type ErrorProcess func(entrys []protocol.Entry) error
func (epp ErrorProcess) ProcessData(entrys []protocol.Entry) {
epp(entrys)
}
// 声明数据处理函数
func ProcessFunc(entrys []protocol.Entry, process func(entrys []protocol.Entry)) {
// 实例化一个 DppProcess
dppProcess := DppProcess(process)
processHandler(entrys, dppProcess)
}
// 声明数据处理函数
// 用于调用 Process 实现类的方法
func processHandler(entrys []protocol.Entry, process Process) {
process.ProcessData(entrys)
}
// 声明全局处理错误函数
func ErrWrapper(errorProcess ErrorProcess) func([]protocol.Entry) {
return func(entrys []protocol.Entry) {
// panic
defer func() {
if r := recover(); r != nil {
// 捕获的异常处理
util.Logger.File("panic-{Ymd}.log").Error(r)
}
}()
// 进入处理函数
err := errorProcess(entrys)
if err != nil {
util.Logger.File("error-{Ymd}.log").Println(err)
}
}
}
````
main.go
````golang
package main
......
func main() {
......
go func() {
process.ProcessFunc(message.Entries,process.ErrWrapper(service.EntryProcess))
}()
......
}
````
#3