golang实现try-catch-finally机制
2018-01-30 23:19
267 查看
面向对象的编程语言往往都会支持语言级别的异常处理,比如c++使用关键字try开始异常语句块, catch捕获异常,throw抛出异常:
而golang的异常机制是:用panic抛出异常,然后在defer中调用recover()捕获异常。
怎么样在golang中实现类似try-catch的异常捕获机制呢?
这里提供一种简单的实现,使用Try函数开启异常捕获,Catch注册异常处理函数:
每次Catch注册异常处理函数需要传入一个具体值 +
调用代码如下:
try { throw 1; throw std::logic_error("user defined exception"); } catch (int e) { std::clog << e << std::endl; } catch (const std::exception& e) { std::clog << e.what() << std::endl; } catch (...) { std::clog << "finally" << std::endl; }
而golang的异常机制是:用panic抛出异常,然后在defer中调用recover()捕获异常。
怎么样在golang中实现类似try-catch的异常捕获机制呢?
这里提供一种简单的实现,使用Try函数开启异常捕获,Catch注册异常处理函数:
package try import "reflect" // Try catches exception from f func Try(f func()) *tryStruct { return &tryStruct{ catches: make(map[reflect.Type]ExeceptionHandler), hold: f, } } // ExeceptionHandler handle exception type ExeceptionHandler func(interface{}) type tryStruct struct { catches map[reflect.Type]ExeceptionHandler hold func() } func (t *tryStruct) Catch(e interface{}, f ExeceptionHandler) *tryStruct { t.catches[reflect.TypeOf(e)] = f return t } func (t *tryStruct) Finally(f func()) { defer func() { if e := recover(); nil != e { if h, ok := t.catches[reflect.TypeOf(e)]; ok { h(e) } else { f() } } }() t.hold() }
每次Catch注册异常处理函数需要传入一个具体值 +
ExceptionHandler,即可捕获具体值对应类型的异常。
调用代码如下:
import ( "log" "try" ) func main() { try.Try(func() { panic("123") }).Catch(1, func(e interface{}) { log.Println("int", e) }).Catch("", func(e interface{}) { log.Println("string", e) }).Finally(func() { log.Println("finally") }) }
相关文章推荐
- Java异常处理机制 try-catch-finally 剖析
- java的异常处理机制(try…catch…finally)
- 《OOC》笔记(2)——C语言实现trycatchfinally
- C#中的异常捕获机制(try catch finally)
- C#中的异常捕获机制(try catch finally)
- java的异常处理机制(try catch finally)
- [置顶] ART异常处理机制(4) - throw & catch & finally实现
- Java异常处理机制以及try-catch-finally-return执行顺序
- [javascript权威指南笔记02]Throw语句和异常处理机制try/catch/finally
- Flex(try-catch-finally)机制(转)
- Java异常机制--try catch finally 执行顺序详解
- C#中的异常捕获机制(try catch finally)
- JAVA学习笔记25——异常机制1:Exception简介+异常处理的try_catch_finally方法
- 经典面试题,try-catch-finally在虚拟机中的实现
- java的异常处理机制(try…catch…finally)
- Java异常处理机制 try-catch-finally
- Flex(try-catch-finally)机制
- java的异常机制五个关键字:throw try catch finally throw
- 异常机制第三十六课,try,_catch,finally,_return执行顺序
- PowerShell: Try...Catch...Finally 实现方法