欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 1839 0

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

但是也有相應的異常處理機制。

需要記住的關鍵詞有個,error,defer,panic,recover。

1 error

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

            
              type error interface {
    Error() string
}

            
          

Go語言使用該接口進行標準的錯誤處理。對于大多數函數,如果要返回錯誤,大致上都可以定義為如下模式,將error作為多種返回值中的最后一個:

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

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

            
          

2 defer

defer相當于java中的finally,c中的析構函數。不管有沒有發生異常的情況下,defer定義的函數都會被執行。一般用來進行資源回收等操作,防止程序員忘記這些操作。

defer語句的用法有兩個優點:

1.讓設計者永遠也不會忘記關閉文件,有時當函數返回時常常忘記釋放打開的資源變量。

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

3 panic-recover運行時異常處理機制

Go語言中沒有Java中那種try-catch-finally結構化異常處理機制,而使用panic()函數引發錯誤(等同于throw/raise),然后在defer語句中調用recover()函數捕獲錯誤,這就是Go語言的異常恢復機制——panic-recover機制。

下面來看一段代碼來綜合運用這4個關鍵詞。

            
              package main

import (
    "fmt"
)

//自定義錯誤類型
type ArithmeticError struct {
    error
}

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

//定義除法運算函數***
func Devide(num1, num2 int) int {
    if num2 == 0 {
        panic(&ArithmeticError{}) //當然也可以使用ArithmeticError{}同時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的內容%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("結果是:", rs)
}

            
          

總結:

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

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美激情视频网 | 国产精品人妻无码免费久久一 | 久久久精彩视频 | 欧美ol丝袜高跟秘书在线播放 | 精品久久久久久无码中文字幕 | a在线免费观看 | 污污视频免费网站 | 黄色网址入口 | 二区在线视频 | 日韩欧美一区二区三区视频 | 亚洲 欧美 日韩 在线 香蕉 | 91亚洲国产成人久久精品网站 | 亚洲天堂中文字幕 | 日本道专区无码中文字幕 | 国产一区二区精品久久91 | 都市妖奇谈 电视剧 | 一级特黄欧美日韩免费视频 | 22eee在线播放成人免费视频 | 婷婷国产成人精品视频 | 色婷婷六月丁香在线观看 | 久久a区 | 国产成人精品免高潮在线观看 | 自拍亚洲一区 | 亚洲精品一区二区三区婷婷月色 | 国产日韩第一页 | 亚洲精品专区 | 国产亚洲精品综合在线网址 | 亚洲偷图色综合色就色 | 日本道专区无码中文字幕 | 免费看的毛片 | 天天摸天天爽视频69视频 | 成人亚洲精品 | 日韩经典欧美一区二区三区 | 亚洲精品在线观看视频 | 日韩第一 | 九九热久久免费视频 | 欧美在线观看视频网站 | 毛片成人网 | 99久久免费中文字幕精品 | 亚洲一区二区三 | 成人一区二区在线 |