程式中「例外」的意義

閱讀時間約 3 分鐘
不知道什麼時候開始,總是會有人問我什麼時候該用例外(Exception)這個功能,我們在許多程式語言裡面會發現不同的設計哲學。有的認為不需要,只要能回傳錯誤碼(Error Code)就足夠,有的則用豐富且強大的例外處理機制。
同時,我們很多時候在開發軟體的過程中不會去考慮例外、設置例外,進而讓這個隨時都可能發生的事情有點熟悉又很陌生。

預期的事情

既然是例外,就表示出現了我們預期以外的事情,就這點而言這個用詞跟翻譯都非常的精確。假設我們認為這段程式執行的時後不應該出現這個情況,那麼它就必須是一個例外。同時,當我們遭遇例外的時候,知不知道如何對應這個例外,就影響來我們是否用救援(rescue)或者捕捉(catch)的方式去處理。
以車禍的情況來說,我們會假設我們在台灣的路上是不會發生車禍的,這也是平常我們預設程式運行的狀況。然而,總是會有發生車禍的時候,如果我們不處理這個車禍,他可能就會一直被傳遞到警察、法官最後變得難以解決。
或者,我們也可以趕快進行處理呼叫道路救援(rescue)來協助我們,最後可能就可以用和解的方式收場。因此在程式中也是相同的,發生例外的嚴重程度取決於我們是否知道該如何「處理」以及如何「補救」這兩個處理方針。

框架中的設計

在 Ruby on Rails 這個框架中,儲存資料會提供 #save 和 #save! 兩種呼叫方式,前者預期會失敗因此出錯時就會回傳否定(false)的結果,後者預期「必定成功」因此失敗時會拋出沒有儲存(RecordNotSaved)的錯誤出來。透過這樣的方式,我們就可以很輕鬆地明白當時撰寫者的認為的情境(Context)是什麼。
同樣的,在查詢資料時我們會使用 #find 這個方法,然而卻沒有 #find! 這個方法,這是因為使用 #find 時是以主鍵(Primary Key)作為前提查詢的,如同我們的身分證字號一般。假設找不到這筆資料,那肯定會是一種例外,而不會是可預期的情況。
能夠以驚嘆號命名方法是 Ruby 語言的特性,透過這樣的小細節,就讓一段程式碼的意圖清晰很多,這也是我喜歡 Ruby 語言的理由之一。

善用例外

很多時候,我們在設計軟體都是以「一切完美」的前提去設計的,因此忽略了不完美的情況。然而,這些不完美的情況也不是我們能夠掌控的,就如同我們無法預知使用者是否會突然斷線一樣。
因此,何時該定義、使用例外,就是在那些我們不知道該如何「補救」的時候,大多數時候我們應該在「預期外的行為」以及「其他程式的例外」兩種情況拋出例外,像是網路斷線時我們可以避免直接拋出斷線,而是改為「無法讀取」的錯誤,讓資訊更為清晰,其他呼叫者也能更精確的定位問題來決定如何補救。

封面圖片使用 UnsplashThomas Kinto 的作品,有想聽的主題可以透過匿名提問告訴我,想了解專業的技術主題可以到弦而時習之找找靈感。
為什麼會看到廣告
55會員
40內容數
軟體工程師逐漸變成一個熱門的職業,當我們進入這個職業之後應該要具備怎樣的技能才會在工作上更加順利呢?這系列的專欄會分享日常工作中的經驗以及一些案例分析,讓我們一起努力成為一位更優秀的軟體工程師吧!
留言0
查看全部
發表第一個留言支持創作者!
蒼時弦也的沙龍 的其他內容
簡單來說,寫程式最困難的地方往往不是技術上的問題,而是如何對當下的狀況正確判斷並且建立良好協作的狀態,才會是最為困難的地方。
聽了描述之後我的直覺反應告訴他「會有這樣的問題,應該是設計時少考慮了什麼!」 大多數軟體工程師從初學者階段開始進入到能夠獨立工作的時候,大多會需要自己考慮一個功能的設計,直到一個完整的系統設計。然而,我們總是找不到正確答案。
「什麼時候會有訂飲料系統呢?」從加入五倍紅寶石軟體開發到現在已經過了五年,每次都會有人提出來,接下來就不了了之。我們是一間九成以上都是工程師的公司,理論上像這樣的系統不應該那麼困難才對,為什麼就是沒辦法做出來呢?
如果有在接觸軟體開發產業,很常見的一個說法是非本科(資訊、工程背景)的工程師底子差,做出來的東西很糟糕之類的。然而,事實真的是這樣嗎?又或者說,我們能夠如何解決這樣的問題?
最近正在製作一些工具加速自己開發網站的速度,能夠製作各種工具輔助自己工作是我還沒成為資深工程師之前一直相信的資深工程師條件之一。
簡單來說,寫程式最困難的地方往往不是技術上的問題,而是如何對當下的狀況正確判斷並且建立良好協作的狀態,才會是最為困難的地方。
聽了描述之後我的直覺反應告訴他「會有這樣的問題,應該是設計時少考慮了什麼!」 大多數軟體工程師從初學者階段開始進入到能夠獨立工作的時候,大多會需要自己考慮一個功能的設計,直到一個完整的系統設計。然而,我們總是找不到正確答案。
「什麼時候會有訂飲料系統呢?」從加入五倍紅寶石軟體開發到現在已經過了五年,每次都會有人提出來,接下來就不了了之。我們是一間九成以上都是工程師的公司,理論上像這樣的系統不應該那麼困難才對,為什麼就是沒辦法做出來呢?
如果有在接觸軟體開發產業,很常見的一個說法是非本科(資訊、工程背景)的工程師底子差,做出來的東西很糟糕之類的。然而,事實真的是這樣嗎?又或者說,我們能夠如何解決這樣的問題?
最近正在製作一些工具加速自己開發網站的速度,能夠製作各種工具輔助自己工作是我還沒成為資深工程師之前一直相信的資深工程師條件之一。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
台灣在繁忙的城市沙漠也有一席的綠洲,就跟著直覺走就會走到屬於這裡的秘境,這是城市浪人曾說過的 在城市迷茫過客 台北的霓虹閃爍、城市的高聳、人群的壅擠、商店的喧囂,讓我這個鄉巴佬踩在十字街頭頭暈傳向,要不是上課的緣故,我也不太會馬路間穿梭,老姜倒是習慣快步調生活, 0km山物所 療
Thumbnail
在找好評價萬華居酒屋?想找萬華晚上喝酒好地方?曾在大理街工作過的我發現:鄰近萬華車站、凱達大飯店附設停車場後方有家烤古醍小酌串燒很不錯,這家開到半夜兩點的萬華居酒屋餐點可外帶、內用,串燒使用炭火燒烤原塊肉口感超好價格又不貴,除了多樣化燒烤之外還提供炸物、熱炒、炒麵飯、鍋物、熱湯,待過飯店的主廚醬
Thumbnail
紫兒佩佩自我療癒作家 *內容 書有圖文,圖由深耕淡水的人繪出,更有深刻的情感。文字也分由,在地的淡水老師,在地深入的觀察,讓曾在淡水生活、讀書的人們玩味,樂不可支。 從地理風貌談到與地景對話,讓您能看到這小鎮的風貌。 *心得 有故事的人和地方,最發人深省,我就是其中之一。當我年輕的時候
Thumbnail
柏林城市中的绿林湖泊,二战废墟堆起的山丘。能畅快地游泳爬山爬树,就是我喜欢的地方,这地方游泳,别有特色。
  城市,是現代生活的繁華樞紐,充斥著喧鬧和忙碌。在這個都市叢林中,每個人都奔波於高樓大廈之間,匆匆忙忙地追求著各自的目標。
Thumbnail
明天要出發來個三天兩夜的小旅行,一早就先把行李給打包好。 提前將周五要交的翻譯寫好,然後暫時不接新案子。 (有些業主其實挺奇怪的,只要他寄出email的那一個瞬間,他就開始期待你可以馬上翻譯好,好像我都不用吃飯,洗澡,溜狗,煮飯一樣的。) 新品牌還在默默的準備中,每天的商品文案,還有小程序準備
Thumbnail
        「100」在我人生中意謂著什麼?小時候考試100分,那真是....,「100」在我人生中出現最具“形象”意義的,是在旅行中不經意看到...,如今邁入人生下半場,「100」在我人生中的意義,就這樣鬼使神差地轉變成...
Thumbnail
在她的媽媽歷經最小的兒子養大後竟被下蠱拐走,這無處宣洩的傷痛使她的媽媽開始吃齋唸佛,有了所謂的信仰。 那แสง(Saeng)呢?不好意思問她是什麼時候開始有信仰,或許小時候就是了,也或許和媽媽一樣,是從某一次的傷痛開始,我只能在心中如此猜想著。
Thumbnail
兩次到宜蘭吃早餐,在回程時,出了雪山隧道,發現從坪林、石碇到新店,往宜蘭的車子大排長龍,而反方向而行的我們卻一路順暢。這時候難免就會覺得:什麼是愜意的人生?在不同的時候,選擇不同的方向,到同一個地方,也許就能活得自在一點、有趣一點、愜意一點。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
Faker昨天真的太扯了,中國主播王多多點評的話更是精妙,分享給各位 王多多的點評 「Faker是我們的處境,他是LPL永遠繞不開的一個人和話題,所以我們特別渴望在決賽跟他相遇,去直面我們的處境。 我們曾經稱他為最高的山,最長的河,以為山海就是盡頭,可是Faker用他28歲的年齡...
Thumbnail
台灣在繁忙的城市沙漠也有一席的綠洲,就跟著直覺走就會走到屬於這裡的秘境,這是城市浪人曾說過的 在城市迷茫過客 台北的霓虹閃爍、城市的高聳、人群的壅擠、商店的喧囂,讓我這個鄉巴佬踩在十字街頭頭暈傳向,要不是上課的緣故,我也不太會馬路間穿梭,老姜倒是習慣快步調生活, 0km山物所 療
Thumbnail
在找好評價萬華居酒屋?想找萬華晚上喝酒好地方?曾在大理街工作過的我發現:鄰近萬華車站、凱達大飯店附設停車場後方有家烤古醍小酌串燒很不錯,這家開到半夜兩點的萬華居酒屋餐點可外帶、內用,串燒使用炭火燒烤原塊肉口感超好價格又不貴,除了多樣化燒烤之外還提供炸物、熱炒、炒麵飯、鍋物、熱湯,待過飯店的主廚醬
Thumbnail
紫兒佩佩自我療癒作家 *內容 書有圖文,圖由深耕淡水的人繪出,更有深刻的情感。文字也分由,在地的淡水老師,在地深入的觀察,讓曾在淡水生活、讀書的人們玩味,樂不可支。 從地理風貌談到與地景對話,讓您能看到這小鎮的風貌。 *心得 有故事的人和地方,最發人深省,我就是其中之一。當我年輕的時候
Thumbnail
柏林城市中的绿林湖泊,二战废墟堆起的山丘。能畅快地游泳爬山爬树,就是我喜欢的地方,这地方游泳,别有特色。
  城市,是現代生活的繁華樞紐,充斥著喧鬧和忙碌。在這個都市叢林中,每個人都奔波於高樓大廈之間,匆匆忙忙地追求著各自的目標。
Thumbnail
明天要出發來個三天兩夜的小旅行,一早就先把行李給打包好。 提前將周五要交的翻譯寫好,然後暫時不接新案子。 (有些業主其實挺奇怪的,只要他寄出email的那一個瞬間,他就開始期待你可以馬上翻譯好,好像我都不用吃飯,洗澡,溜狗,煮飯一樣的。) 新品牌還在默默的準備中,每天的商品文案,還有小程序準備
Thumbnail
        「100」在我人生中意謂著什麼?小時候考試100分,那真是....,「100」在我人生中出現最具“形象”意義的,是在旅行中不經意看到...,如今邁入人生下半場,「100」在我人生中的意義,就這樣鬼使神差地轉變成...
Thumbnail
在她的媽媽歷經最小的兒子養大後竟被下蠱拐走,這無處宣洩的傷痛使她的媽媽開始吃齋唸佛,有了所謂的信仰。 那แสง(Saeng)呢?不好意思問她是什麼時候開始有信仰,或許小時候就是了,也或許和媽媽一樣,是從某一次的傷痛開始,我只能在心中如此猜想著。
Thumbnail
兩次到宜蘭吃早餐,在回程時,出了雪山隧道,發現從坪林、石碇到新店,往宜蘭的車子大排長龍,而反方向而行的我們卻一路順暢。這時候難免就會覺得:什麼是愜意的人生?在不同的時候,選擇不同的方向,到同一個地方,也許就能活得自在一點、有趣一點、愜意一點。