go mysql recover_golang用panic和recover做业务流程中断的尝试

随着使用golang越来越频繁,发现golang有一个地方非常不方便,就是在错误处理方面。先来看看golang中通常的错误处理方法:

通常的error处理

package main

import (

"errors"

"fmt"

)

func a() (err error) {

err = errors.New("错误")

return

}

func main() {

err := a()

if err != nil {

fmt.Println(err)

}

}

函数在返回的时候增加error类型的返回值,如果有错误则赋值给err,在调用函数处对err进行判断,如果不为nil则处理错误。这种方式在嵌套的层少的时候还好办,要是嵌套的层多了那就要一级一级的返回err,显然会很麻烦。如下面的代码:

package main

import (

"errors"

"fmt"

)

func a() (err error) {

err = b()

if err != nil {

return

}

err = c()

if err != nil {

return

}

err = errors.New("a内错误")

return

}

func b() (err error) {

err = errors.New("b内错误")

return

}

func c() (err error) {

err = errors.New("c内错误")

return

}

func main() {

err := a()

if err != nil {

fmt.Println(err)

}

}

a函数内调用了b和c函数,调用后都要进行err != nil的判断,如果再来个d方法,e方法,那岂不是非常麻烦。在实际开发的时候,这种多层嵌套也经常存在,比如用户注册功能就要判断很多东西:表单验证是否OK;用户是否已经存在;数据插入是否OK等等。

用panic的尝试

于是我就想有没什么办法更加方便,至少不用调用每个函数都判断下err!=nil,这样就可以省掉三行代码。了解到golang中的panic方法可以直接中断流程,感觉到沿着这个应该能找到解决方法。了解了下panic的详细使用,其实也很简单,就是panic一下,如果需要捕获这个panic的错误,就在外围的方法事先声明recover方法。看下代码:

package main

import (

"log"

)

func main() {

defer func() {

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

log.Printf("Runtime error caught: %v", r)

}

}()

a()

}

func a() {

panic("a内错误")

}

a函数内抛出了错误,被外围事先defer的函数recover到,接着就能对错误进行处理了。用这样的方式来改造上面用err处理的代码看看。

package main

import (

"log"

)

func a() {

b()

c()

panic("a内错误")

return

}

func b() {

panic("b内错误")

}

func c() (err error) {

panic("c内错误")

}

func main() {

defer func() {

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

log.Printf("Runtime error caught: %v", r)

}

}()

a()

}

可以看到整个代码都简洁了很多,当然这里的代码比较简单可能看不出什么太大效果,在业务较为繁杂、经常要做各种校验的时候就可以显现出简洁了。

在开发api接口项目的时候,我会封装好recover的方法用来处理内部返回的错误信息,然后统一输出到客户端,感觉便捷很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROC曲线【转】

ROC曲线(Receiver Operating Characteeristic Curve)是显示Classification模型真正率和假正率之间折中的一种图形化方法 解读ROC图的一些概念定义: 真正(True Positive , TP)被模型预测为正的正样本 假负(F…

更改密码 sp_password

sp_password添加或更改 Microsoft SQL Server™ 登录的密码。语法sp_password[ [ old ] old_password , ]{ [new ] new_password }[, [ loginame ] login ]参数[old] old_password是旧密码。old_password为 sysname 类型,其默认值为 NULL。[new] new_password是新…

java eclipse oxygen_Eclipse Java Oxygen配置Tomcat

eclipse oxygen 配置tomcat 9.0第一步 装上eclipse的EE插件因为我以前学习java都是用eclipse oxygen的se版本,所以并不支持j2EE,所以第一步,就是要先把它升级为EE版本。有两种方法供我们选择。重新安装eclipse的EE版本。安装eclipse的EE插件。…

五大常用算法之二:动态规划算法

一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、基本思想与策略 基本思想与分治法类似&am…

java 数组处理_JAVA操作数组

使用 Arrays 类操作 Java 中的数组Arrays 类是 Java 中提供的一个工具类,在 java.util 包中。该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序、搜索等Arrays 中常用的方法:1、 排序语法: Arrays.sort(数组名);可…

VB调用VC DLL函数

—————————————————————————VC部分—————————————————————————————————————声明 ******************************************************************************************************** extern "C&q…

java拆装_JAVA线性表拆解

线性表(List)是一种线性结构。其特点是数据元素直线的线性关系。1.线性表抽象类定义public abstract class AbsList implements Iterable,List{protected int length;abstract public T get(int i); //返回第i(i≥0)个元素abstract public boolean set(int i, T x);…

display:none;与visibility:hidden;的区别

display:none;不会占用任何空间 visibility:hidden;会占用隐藏前的空间大小转载于:https://www.cnblogs.com/yaser/p/4414825.html

(转)起点

要想做Java程序员,并不需要必须是计算机专业出身。很多人不是计算机专业却也成为计算机高手;有的高中生都已经小有所成,可称得上是合格程序员了;甚至很多学校初中生都能写出漂亮的应用程序。所以,Java程序员的起点要求…

以太网 数据包速率计算方法

以太网 数据包速率计算方法 我们知道1个千兆端口的线速包转发率是1.4881MPPS, 百兆端口的线速包转发率是0.14881MPPS,这是国际标准,但是如何得来的呢? 具体的数据包在传输过程中会在每个包的前面加上64个(前导符)pream…

linux 多个java_linux 同时出现两个java进程,新手~ 请详细说明,这个是怎么回事。 我就装了一个jdk...

首先Tomcat是用java开发的,所以它的开始和停止的命令都是用java来执行的。你执行一下ps -ef |grep tomcat如果输出:sun 5144 1 0 10:21 pts/1 00:00:06 /java/jdk/bin/java -Djava.util.logging.managerorg.apache.juli.ClassLoaderLogManager -Djava.en…

ISP与IAP的区别

转: ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。IAP(In-Application P…

【转】手把手实现企业级开源监控软件cacti+nagios+ntop整合(图解)

http://freeze.blog.51cto.com/1846439/386828转载于:https://www.cnblogs.com/nhlinkin/p/3595532.html

【BZOJ】【1041】【HAOI2008】圆周上的点

数学 orz hzwer 完全不会做…… 很纠结啊,如果将来再遇到这种题,还是很难下手啊…… 引用题解: 【分析】: 样例图示: 首先,最暴力的算法显而易见:枚举x轴上的每个点,带入圆的方程,检…

php authcode java_PHP(authcode)加密解密

//************************加密解密*************************//** $string: 明文 或 密文* $operation:DECODE表示解密,其它表示加密* $key: 密匙* $expiry:密文有效期* */function authcode($string, $operation DECODE, $key…

nginx环境下搭建nagios 3.5.0,及配置pnp4nagios画图

本文基于《LNMP最新源码安装脚本》,Nagios依赖PHP环境和perl环境,由于Nginx不支持Perl的CGI,需先来搭建Perl环境,Nagios原理介绍略。一、下载最新稳定源码包和Perl脚本wget http://www.cpan.org/modules/by-module/FCGI/FCGI-0.74.tar.gzwget…

python indexerror怎么办_Python IndexError:使用列表作为可迭代对象时...

这是代码:import math as mprimeproduct 5397346292805549782720214077673687806275517530364350655459511599582614290primes [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127…

【Android】配置APK开发环境

【Android】配置APK开发环境1.安装java jdk去oracle公司下载jdk-7u15-windows-i586.exehttp://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260-zhs.html---C:\Documents and Settings\XXXX>java -versionjava version "1.7.0_15"Ja…

C++细节系列(零):零散记录

老规矩:记录细节,等待空余,再进行整理。 1:const,static,const static成员初始化。 1、const成员:只能在构造函数后的初始化列表中初始化 2、static成员:初始化在类外,且不加static修饰。 3、co…