捕獲上下文信息

作者:Erica Sadun,原文鏈接强霎,原文日期:2015-08-27
譯者:CMB宣吱;校對:numbbbbb;定稿:千葉知風

假設你正在使用一個類型明未,當有錯誤時發(fā)生時你想要輸出異常發(fā)生時的上下文槽华。通常你會使用一些內(nèi)置的編譯器關(guān)鍵字:__FUNCTION____LINE____FILE__ 趟妥,這些關(guān)鍵詞提供了有關(guān)函數(shù)調(diào)用詳細的文本插值:

public struct Error: ErrorType {
    let source: String; let reason: String
    public init(_ reason: String, source: String = __FUNCTION__,
        file: String = __FILE__, line: Int = __LINE__) {
            self.reason = reason; self.source = "\(source):\(file):\(line)"
    }
}

一行典型的 Error 輸出如下所示:

Error(source: "myFunction():<EXPR>:14", reason: "An important reason")

雖然這種結(jié)構(gòu)能夠讓你捕獲出現(xiàn)異常的函數(shù)猫态、文件和行號,但你無法捕捉?jīng)]有類型參數(shù)的原始父類型煮纵。為了捕獲該類型懂鸵,需要在 Error 結(jié)構(gòu)體構(gòu)造器中包含“原始類型”,并向構(gòu)造器中傳遞 self.dynamicType 參數(shù)行疏。

public struct Error: ErrorType {
    let source: String; let reason: String
    public init(_ reason: String, type: Any = "", 
        source: String = __FUNCTION__,
        file: String = __FILE__, 
        line: Int = __LINE__) {
            self.reason = reason; self.source = "\(source):\(file):\(line):\(type)"
    }
}

我很不喜歡這種額外添加類型參數(shù)的方式匆光,它唯一的作用就是簡化錯誤生成。

public struct Parent {
    func myFunction() throws {
        throw Error("An important reason", type: self.dynamicType)}
}

do {try Parent().myFunction()} catch{print(error)}
// Error(source: "myFunction():<EXPR>:14:Parent", reason: "An important reason")

我更喜歡擴展 Contextualizable 來實現(xiàn)自動捕獲類型上下文酿联。注意终息,默認實現(xiàn)的協(xié)議方法中用到了 self.dynamicType,它不能被用在方法簽名中(譯者注:也就是說不能當做函數(shù)參數(shù)或者返回值)贞让。

protocol Contextualizable {}
extension Contextualizable {
    func currentContext(file : String = __FILE__, function : String = __FUNCTION__, line : Int = __LINE__) -> String {
        return "\(file):\(function):\(line):\(self.dynamicType)"
    }
}

結(jié)合上述兩種方法可以簡化整個過程輕松實現(xiàn)我們的目標周崭。共享 Error 類型之后就可以把變量改成常量,并且把上下文相關(guān)代碼從 Error 構(gòu)造器移動到遵循協(xié)議的類型中喳张,這樣就可以自動繼承 currentContext 方法续镇。

public struct Error: ErrorType {
    let source: String; let reason: String
    public init(_ source: String = __FILE__, _ reason: String) {
        self.reason = reason; self.source = source
    }
}
public struct Parent: Contextualizable {
    func myFunction() throws {
        throw Error(currentContext(), "An important reason")}

更新之后,錯誤輸出中會包含原始類型销部。

正如讀者 Kametrixom 所指出的摸航,你還可以擴展 Contextualizable 協(xié)議并創(chuàng)建你自己的錯誤。(他還寫了一個非常棒的錯誤類型舅桩,可以選擇是否添加上下文酱虎。)

本文的所有代碼可以在 這個 Gist 中找到(譯者注:Gist 已經(jīng)被墻,需要翻墻查看)擂涛。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末读串,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恢暖,老刑警劉巖排监,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杰捂,居然都是意外死亡社露,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門琼娘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人附鸽,你說我怎么就攤上這事脱拼。” “怎么了坷备?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵熄浓,是天一觀的道長。 經(jīng)常有香客問我省撑,道長赌蔑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任竟秫,我火速辦了婚禮娃惯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肥败。我一直安慰自己趾浅,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布馒稍。 她就那樣靜靜地躺著皿哨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纽谒。 梳的紋絲不亂的頭發(fā)上证膨,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音鼓黔,去河邊找鬼央勒。 笑死,一個胖子當著我的面吹牛请祖,可吹牛的內(nèi)容都是我干的订歪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肆捕,長吁一口氣:“原來是場噩夢啊……” “哼刷晋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤眼虱,失蹤者是張志新(化名)和其女友劉穎喻奥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捏悬,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡撞蚕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了过牙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甥厦。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寇钉,靈堂內(nèi)的尸體忽然破棺而出刀疙,到底是詐尸還是另有隱情,我是刑警寧澤扫倡,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布谦秧,位于F島的核電站,受9級特大地震影響撵溃,放射性物質(zhì)發(fā)生泄漏疚鲤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一缘挑、第九天 我趴在偏房一處隱蔽的房頂上張望集歇。 院中可真熱鬧,春花似錦卖哎、人聲如沸鬼悠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焕窝。三九已至,卻和暖如春维贺,著一層夾襖步出監(jiān)牢的瞬間它掂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工溯泣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虐秋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓垃沦,卻偏偏與公主長得像客给,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肢簿,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 作者:Erica Sadun靶剑,原文鏈接蜻拨,原文日期:2015-08-27譯者:CMB;校對:numbbbbb桩引;定稿:...
    mbillchan閱讀 252評論 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,805評論 1 10
  • 常量與變量使用let來聲明常量缎讼,使用var來聲明變量。聲明的同時賦值的話坑匠,編譯器會自動推斷類型血崭。值永遠不會被隱式轉(zhuǎn)...
    莫_名閱讀 448評論 0 1
  • 1、范型范型所解決的問題 函數(shù)厘灼、方法夹纫、類型:類,結(jié)構(gòu)體设凹,枚舉捷凄,元組類型,協(xié)議參數(shù)围来,返回值,成員函數(shù)參數(shù)匈睁,成員屬性類...
    我是小胡胡123閱讀 826評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理监透,服務發(fā)現(xiàn),斷路器航唆,智...
    卡卡羅2017閱讀 134,656評論 18 139