首页 > 其他分享 >如何让错误处理更加优雅

如何让错误处理更加优雅

时间:2023-03-03 16:22:53浏览次数:39  
标签:return err nil 优雅 Book2 func error 错误处理 更加

1.go 采用c 的err方法,但是容易产生大量的外部判断。

package killer

import "fmt"

type Book struct {
    Name   string
    Price  int
    Store  int
    Member int
}

func clientExample() {
    book := &Book{
        Name:   "golang",
        Price:  100,
        Store:  100,
        Member: 1,
    }
    err := book.CalcDiscount(99)
    if err != nil {
        return
    }
    err = book.JuedeIfStore()
    if err != nil {
        return
    }
    err = book.IfSale()
    if err != nil {
        return
    }
    err = book.CalcTotal()
    if err != nil {
        return
    }
    fmt.Println("ok")
}
func (b *Book) CalcDiscount(count int) error {
    // ...
    b.Price = b.Price * count / 100
    err := SomeError()
    if err != nil {
        return err
    }
    return nil
}
func (b *Book) JuedeIfStore() error {

    return nil
}
func (b *Book) IfSale() error {
    // ...
    return nil
}
func (b *Book) CalcTotal() error {
    // ...
    return nil
}
func (b *Book) AddPay() error {
    // ...
    return nil
}
func (b *Book) AddOrder() error {
    // ...
    return nil
}

func SomeError() error {
    return fmt.Errorf("some error")
}
View Code

2.如果一个结构体中有大量的错误需要判断,那么可以这样

 1 package killer
 2 
 3 import "fmt"
 4 
 5 func someError() error {
 6     return fmt.Errorf("some error")
 7 }
 8 
 9 type Book2 struct {
10     Name   string
11     Price  int
12     Store  int
13     Member int
14     error  error
15 }
16 
17 func clientExample2() {
18     book2 := &Book2{
19         Name:   "golang",
20         Price:  100,
21         Store:  100,
22         Member: 1,
23     }
24     book2.CalcDiscount(99).
25         JuedeIfStore().
26         IfSale().
27         AddPay().
28         AddOrder().
29         CheckAll()
30 
31     fmt.Println("ok")
32 
33 }
34 
35 func (b *Book2) CalcDiscount(count int) *Book2 {
36     if b.error != nil {
37         return b
38     }
39     // 具体的业务逻辑..
40     b.error = someError()
41     return b
42 }
43 
44 func (b *Book2) JuedeIfStore() *Book2 {
45     if b.error != nil {
46         return b
47     }
48     // 具体的业务逻辑
49     return b
50 }
51 func (b *Book2) IfSale() *Book2 {
52     if b.error != nil {
53         return b
54     }
55     return b
56 }
57 func (b *Book2) CalcTotal() *Book2 {
58     if b.error != nil {
59         return b
60     }
61     return b
62 }
63 func (b *Book2) AddPay() *Book2 {
64     if b.error != nil {
65         return b
66     }
67     return b
68 }
69 func (b *Book2) AddOrder() *Book2 {
70     if b.error != nil {
71         return b
72     }
73     return b
74 }
75 
76 func (b *Book2) CheckAll() *Book2 {
77     if b.error != nil {
78         return b
79     }
80     return b
81 }
View Code

2.1 把错误集中到结构体的属性中

2.2 让error在不同的方法中以值的形式传递下去

2.3 在每个方法的前面先判断一下这个error是否存在,如果存在则退出

2.4 否则进入正常的业务处理,当发生错误的时候,给他赋值,让下一个方法处理

2.5 调用的时候可以形成漂亮的链式调用

 

标签:return,err,nil,优雅,Book2,func,error,错误处理,更加
From: https://www.cnblogs.com/gongxianjin/p/17176096.html

相关文章

  • python+playwright 学习-21.文件上传-优雅处理
    前言如果你之前用过selenium,肯定遇到过文件上传头疼的事,有些控件是input输入框,可以直接传本地文件地址,然而有些需要弹出本地文件选择器的时候就不好处理了。playwright......
  • python+playwright 学习-19.监听dialog事件-优雅处理对话框
    前言网页上的alert弹出框你不知道什么时候弹出来,selenium处理alert弹出框的方式是先判断有没alert再处理,并且只能处理这一次。playwright框架可以监听dialog事件,不管......
  • 如何优雅的处理异步错误
    原文:HowtoavoiduncaughtasyncerrorsinJavascript目录异步IIFE异步forEachPromiseDOM事件监听一、异步IIFE一个简单的异步IIFE(async()=>{th......
  • 如何实现延迟任务,这11种方式才算优雅!
    大家好,我是三友~~延迟任务在我们日常生活中比较常见,比如订单支付超时取消订单功能,又比如自动确定收货的功能等等。所以本篇文章就来从实现到原理来盘点延迟任务的11种实......
  • [1] Windows 错误处理
    [1]Windows错误处理1.关于windows系统函数的返回值错误处理VOID:这个函数不可能失败BOOL:如果函数调用失败,返回值为0,即为FALSE,否则为非0值,即为TRUEHANDLE:如果函数失......
  • 旋转数组的二分查找 代码重构 追求优雅的代码
    今天面试一个小伙问旋转数组的二分搜索,https://leetcode.cn/problems/search-in-rotated-sorted-array我自己先写了一份代码如下,是不是觉得很丑陋,重复代码较多?classSo......
  • 图解 SQL 的执行顺序,优雅
     SQL是一个声明式语言一个完整的SQL语句会告诉MySqlserver要从那些表中查数据【得到数据集】,对得到的数据集按什么条件进行筛选【where】,按什么规则进行分组、计算......
  • 这样在管理后台里实现 403 页面实在是太优雅了
    前言403页面通常表示无权限访问,与404页面代表着不同含义。而大部分管理后台框架仅提供了404页面的支持,但却忽略了对403页面的处理,有的框架虽然也有对403页面的处......
  • Vue2 里如何优雅的清除一个定时器
    绝大多数人清除定时器的方法<script>exportdefault{data(){return{timer:null}},mounted(){this.timer=setInterval(()=>{......
  • 如何优雅地在 React 中使用TypeScript,看这一篇就够了!
    工作用的技术栈主要是Reacthooks+TypeScript。使用三月有余,其实在单独使用TypeScript时没有太多的坑,不过和React结合之后就会复杂很多。本文就来聊一聊TypeScript与Re......