• 异常处理


     

    【暴力处理】恐慌异常处理

     1 //【暴力方式】求球的体积
     2 //半径如果为负数,直接panic
     3 
     4 package main
     5 
     6 import (
     7     "fmt"
     8     "math"
     9 )
    10 
    11 //球的函数 面积公式
    12 func GetToyBallVolumn(radius float64) float64 {
    13 
    14     //【模拟恐慌】就是定义报错内容,让程序崩掉,抛出异常.
    15     if radius < 0 {
    16         panic("小球半径不能为负数...")
    17     }
    18 
    19     return (4 / 3.0) * math.Pi * math.Pow(radius, 3)
    20 }
    21 
    22 func main() {
    23 
    24     //【处理恐慌】从恐慌中复活,找到恐慌的原因,在函数结束之前,处理恐慌
    25     defer func() {
    26         if err := recover(); err != nil {
    27             fmt.Println("致死的原因是: ", err)
    28         }
    29 
    30     }()
    31 
    32     //因为传递了负数半径死于此处.
    33     volumn := GetToyBallVolumn(-1)
    34     fmt.Println("球的体积是: ", volumn)
    35 
    36 }
    37 
    38 /*
    39 致死的原因是:  小球半径不能为负数...
    40  */

    [温和处理]错误和处理

     1 //【温和方式报错】半径如果不在取值范围内,温和地返回【结果-错误】
     2 
     3 package main
     4 
     5 import (
     6     "errors"
     7     "fmt"
     8     "math"
     9 )
    10 
    11 //球的函数 面积公式
    12 func GetToyBallVolumn(radius float64) (volumn float64, err error) {
    13 
    14     //【模拟恐慌】就是定义报错内容,让程序崩掉,抛出异常.
    15     if radius < 0 {
    16         panic("小球半径不能为负数...")
    17     }
    18 
    19     //半径如果不在取值范围内,温和的返回错误.
    20     if radius < 5 || radius > 50 {
    21         err = errors.New("合法的半径范围是[5-50]")
    22         return
    23     }
    24 
    25     return (4 / 3.0) * math.Pi * math.Pow(radius, 3), nil
    26 }
    27 
    28 func main() {
    29     volumn, err := GetToyBallVolumn(1)
    30     if err != nil {
    31         fmt.Println("获取体积失败:", err)
    32         return
    33     }
    34     fmt.Println("小球的体积是,", volumn)
    35 }
    36 /*
    37 获取体积失败: 合法的半径范围是[5-50]
    38 
    39  */

    自定义错误

     1 package main
     2 
     3 import (
     4     "fmt"
     5     "math"
     6 )
     7 
     8 //自定义异常InvalidRadiusError
     9 type InvalidRadiusError struct {
    10     //非法半径
    11     Radius float64
    12     //可接受最小半径
    13     MinRadius float64
    14     //可接受最大半径
    15     MaxRadius float64
    16 }
    17 
    18 func (ire *InvalidRadiusError) Error() string {
    19     //Sprintf的意思是不打印内容,把结果返回给变量,自己知道怎么用.
    20     info := fmt.Sprintf("%.2f是非法半径,合法半径的范围是[%.2f,%.2f]
    ", ire.Radius, ire.MinRadius, ire.MaxRadius)
    21     return info
    22 }
    23 
    24 //工厂方法
    25 func NewInvalidRadiusError(radius float64) *InvalidRadiusError {
    26     ire := new(InvalidRadiusError)
    27     ire.MinRadius = 5
    28     ire.MaxRadius = 50
    29     ire.Radius = radius
    30     return ire
    31 }
    32 
    33 //球的函数 面积公式
    34 func GetToyBallVolumn(radius float64) (volumn float64, err error) {
    35 
    36     //【模拟恐慌】就是定义报错内容,让程序崩掉,抛出异常.
    37     if radius < 0 {
    38         panic(NewInvalidRadiusError(radius))
    39     }
    40 
    41     //半径如果不在取值范围内,温和的返回错误.
    42     if radius < 5 || radius > 50 {
    43         err = NewInvalidRadiusError(radius)
    44         return
    45     }
    46 
    47     return (4 / 3.0) * math.Pi * math.Pow(radius, 3), nil
    48 }
    49 
    50 func main() {
    51 
    52     //解决恐慌问题,避免程序报错退出。
    53     defer func() {
    54         if err := recover();err !=nil{
    55             fmt.Println(err)
    56         }
    57     }()
    58 
    59 
    60     volumn, err := GetToyBallVolumn(-1)
    61     if err != nil {
    62         fmt.Println("获取体积失败:", err)
    63         return
    64     }
    65     fmt.Println("小球的体积是,", volumn)
    66 }
    67 
    68 /*
    69 获取体积失败: 1.00是非法半径,合法半径的范围是[5.00,50.00]
    70 -1.00是非法半径,合法半径的范围是[5.00,50.00]
    71 
    72  */
  • 相关阅读:
    elasticsearch query 和 filter 的区别
    java 模拟简单搜索
    filterBuilders 构建过滤器query
    elasticsearch java 索引操作
    lesson4:利用jmeter来压测数据库
    lesson3:使用java代码的方式对不能识别的协议进行压力测试
    lession2:使用HTTP Cookie 管理器来传递cookies值
    lesson1:压测普通网页
    php mysql find_in_set函数 检索单子段 逗号分隔序列
    写出一种排序算法(要写出代码),并说出优化它的方法。(新浪面试题)
  • 原文地址:https://www.cnblogs.com/chaoyangxu/p/11975973.html
Copyright © 2020-2023  润新知