日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

C/C++、Java、Go、Python總結(jié)對比29-異常處理-go

系統(tǒng) 1952 0

go語言為了更加簡潔優(yōu)雅,沒有類似java的try...catch...這種寫法,因?yàn)閠ry...catch在某些情況下會嵌套使用,造成代碼運(yùn)行后不知道哪里就跑到了異常處理的代碼里。

但是也有相應(yīng)的異常處理機(jī)制。

需要記住的關(guān)鍵詞有個(gè),error,defer,panic,recover。

1 error

error類似java中的Exception類型,不同的是Exception必須搭配throw和catch使用。Go語言中的error類型實(shí)際上是抽象了Error()方法的error接口:

            
              type error interface {
    Error() string
}

            
          

Go語言使用該接口進(jìn)行標(biāo)準(zhǔn)的錯(cuò)誤處理。對于大多數(shù)函數(shù),如果要返回錯(cuò)誤,大致上都可以定義為如下模式,將error作為多種返回值中的最后一個(gè):

            
              //定義函數(shù)
func Foo(param int)(n int, err error) {
    // ...
}

//調(diào)用函數(shù)
n, err := Foo(0)
if err != nil {
    // 錯(cuò)誤處理
} else {
    // 使用返回值n
}

            
          

2 defer

defer相當(dāng)于java中的finally,c中的析構(gòu)函數(shù)。不管有沒有發(fā)生異常的情況下,defer定義的函數(shù)都會被執(zhí)行。一般用來進(jìn)行資源回收等操作,防止程序員忘記這些操作。

defer語句的用法有兩個(gè)優(yōu)點(diǎn):

1.讓設(shè)計(jì)者永遠(yuǎn)也不會忘記關(guān)閉文件,有時(shí)當(dāng)函數(shù)返回時(shí)常常忘記釋放打開的資源變量。

2.將關(guān)閉和打開靠在一起,程序的意圖變得清晰很多。

3 panic-recover運(yùn)行時(shí)異常處理機(jī)制

Go語言中沒有Java中那種try-catch-finally結(jié)構(gòu)化異常處理機(jī)制,而使用panic()函數(shù)引發(fā)錯(cuò)誤(等同于throw/raise),然后在defer語句中調(diào)用recover()函數(shù)捕獲錯(cuò)誤,這就是Go語言的異常恢復(fù)機(jī)制——panic-recover機(jī)制。

下面來看一段代碼來綜合運(yùn)用這4個(gè)關(guān)鍵詞。

            
              package main

import (
    "fmt"
)

//自定義錯(cuò)誤類型
type ArithmeticError struct {
    error
}

//重寫Error()方法
func (this *ArithmeticError) Error() string {
    return "自定義的error,error名稱為算數(shù)不合法"
}

//定義除法運(yùn)算函數(shù)***
func Devide(num1, num2 int) int {
    if num2 == 0 {
        panic(&ArithmeticError{}) //當(dāng)然也可以使用ArithmeticError{}同時(shí)recover等到ArithmeticError類型
    } else {
        return num1 / num2
    }
}
func main() {
    var a, b int
    fmt.Scanf("%d %d", &a, &b)

    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("panic的內(nèi)容%v\n", r)
            if _, ok := r.(error); ok {
                fmt.Println("panic--recover()得到的是error類型")
            }
            if _, ok := r.(*ArithmeticError); ok {
                fmt.Println("panic--recover()得到的是ArithmeticError類型")
            }
            if _, ok := r.(string); ok {
                fmt.Println("panic--recover()得到的是string類型")
            }
        }
    }()

    rs := Devide(a, b)
    fmt.Println("結(jié)果是:", rs)
}

            
          

總結(jié):

  1. go中error相當(dāng)于java中的Exception,defer相當(dāng)于java中的finally,panic相當(dāng)于java中的throw,panic和recover一起使用相當(dāng)于java中的try...catch...。

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 丹寨县| 东丰县| 阜宁县| 达州市| 长泰县| 海门市| 乐陵市| 高密市| 沁源县| 明星| 潮安县| 海盐县| 图木舒克市| 卓尼县| 新津县| 广德县| 大渡口区| 德庆县| 天气| 定远县| 察哈| 天镇县| 长岛县| 浦城县| 旺苍县| 罗甸县| 仪陇县| 雅江县| 阜平县| 东丽区| 乾安县| 淄博市| 南丰县| 泗洪县| 洞口县| 长沙市| 和林格尔县| 兰州市| 托克托县| 准格尔旗| 城市|