go语言2.0异常处理 go语言chan

Go 数据库操作异常处理第一种写法
第二种写法
上述两种写法说明:
两种写法都没啥问题,第一种写法,如果只插入一条数据,可以使用第一种写法简单;第二种写法可以拿到执行的*DB,方便后续的 DB 操作
说明:
update 方法将返回执行完之后的 *DB, 需要通过指针对象才能获取正确的RowAffected。
事务的提交也可能会有error, 要判断是否正确commit
需要判断tx.Error ,因为事务的提交可能会有error
其实要注意的是,没查询到结果,也会返回一个Error
gorm的 ErrRecordNotFound 也好理解 , 假设根据身份证号查询公民信息,如果是一个无效的身份证ID , 那必然无法查询到结果,其实就是查询不到结果,会返回一个错误 。
当然 GORM 提供了一个处理 RecordNotFound 错误的快捷方式,如果发生了多个错误,它将检查每个错误,如果它们中的任何一个是RecordNotFound 错误 。
当一个程序中使用两个不同的数据库时, 重写方法DefaultTableNameHandler()会影响到两个数据库中的表名 。其中一个数据库需要设置表前缀时,访问另一个数据库的表也可能会被加上前缀 。因为是包级别的方法 , 整个代码里只能设置一次值 。
golang异常处理go语言没有使用像java python等语言的try catch/except 语句来处理异常 , 而是使用它特有的panic,recover,defer来捕获和处理异常
分析:
divide是一个做除法的函数,可能会出现除数为0的错误 , 所以在函数一开头就定义了一个defer匿名函数(注意这里的匿名函数定义完后面要带上括号才能执行),这个匿名函数被defer修饰了所以只在divide函数执行完才会执行,而不是一进来就执行 。后面判断b是否等于0,如果为零的话我们手动使用panic抛出了异常,这个异常是在divide函数退出前执行的defer匿名函数里通过recover()来捕获的,如果err不为空就说明发生了错误,打印error happen!和panic抛出的divided by zero!! 然后主协程返回到主函数main里,继续执行后面的打印
golang编程中,不属于异常处理的关键词是error 。Go语言又称Golang是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言,在该语言种类中error不属于异常处理的关键词,因为error仅仅是用来提示错误的词 , 和异常处理功能无关 。
Golang 中更好的错误处理:理论和实践技巧 云和安全管理服务专家新钛云服 张春翻译
这种方法有几个缺点 。首先,它可以对程序员隐藏错误处理路径,特别是在捕获异常不是强制性的情况下,例如在 Python 中 。即使在具有必须处理的 Java 风格的检查异常的语言中,如果在与原始调用不同的级别上处理错误,也并不总是很明显错误是从哪里引发的 。
我们都见过长长的代码块包装在一个 try-catch 块中 。在这种情况下 , catch 块实际上充当 goto 语句,这通常被认为是有害的(奇怪的是 , C 中的关键字被认为可以接受的少数用例之一是错误后清理,因为该语言没有 Golang- 样式延迟语句) 。
如果你确实从源头捕获异常 , 你会得到一个不太优雅的 Go 错误模式版本 。这可能会解决混淆代码的问题 , 但会遇到另一个问题:性能 。在诸如 Java 之类的语言中,抛出异常可能比函数的常规返回慢数百倍 。
Java 中最大的性能成本是由打印异常的堆栈跟踪造成的,这是昂贵的,因为运行的程序必须检查编译它的源代码。仅仅进入一个 try 块也不是空闲的,因为需要保存 CPU 内存寄存器的先前状态,因为它们可能需要在抛出异常的情况下恢复 。

推荐阅读