程式中「例外」的意義

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

預期的事情

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

框架中的設計

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

善用例外

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

封面圖片使用 UnsplashThomas Kinto 的作品,有想聽的主題可以透過匿名提問告訴我,想了解專業的技術主題可以到弦而時習之找找靈感。
為什麼會看到廣告
53會員
40內容數
軟體工程師逐漸變成一個熱門的職業,當我們進入這個職業之後應該要具備怎樣的技能才會在工作上更加順利呢?這系列的專欄會分享日常工作中的經驗以及一些案例分析,讓我們一起努力成為一位更優秀的軟體工程師吧!
留言0
查看全部
發表第一個留言支持創作者!
蒼時弦也的沙龍 的其他內容
軟體工程師的素養
閱讀時間約 2 分鐘
軟體是一種生物
閱讀時間約 2 分鐘
寫程式最困難的地方
閱讀時間約 2 分鐘
你可能也想看
城市中的綠洲 X 0km山物所台灣在繁忙的城市沙漠也有一席的綠洲,就跟著直覺走就會走到屬於這裡的秘境,這是城市浪人曾說過的 在城市迷茫過客 台北的霓虹閃爍、城市的高聳、人群的壅擠、商店的喧囂,讓我這個鄉巴佬踩在十字街頭頭暈傳向,要不是上課的緣故,我也不太會馬路間穿梭,老姜倒是習慣快步調生活, 0km山物所 療
Thumbnail
avatar
狙擊王
2024-04-24
品味城市中的隱藏美食寶藏,使用原肉、醬料自製、超值美味平價居酒屋-台北市萬華區烤古醍小酌串燒 在找好評價萬華居酒屋?想找萬華晚上喝酒好地方?曾在大理街工作過的我發現:鄰近萬華車站、凱達大飯店附設停車場後方有家烤古醍小酌串燒很不錯,這家開到半夜兩點的萬華居酒屋餐點可外帶、內用,串燒使用炭火燒烤原塊肉口感超好價格又不貴,除了多樣化燒烤之外還提供炸物、熱炒、炒麵飯、鍋物、熱湯,待過飯店的主廚醬
Thumbnail
avatar
emilyyang0906
2024-01-16
讀《城市中的森林》發現淡水紫兒佩佩自我療癒作家 *內容 書有圖文,圖由深耕淡水的人繪出,更有深刻的情感。文字也分由,在地的淡水老師,在地深入的觀察,讓曾在淡水生活、讀書的人們玩味,樂不可支。 從地理風貌談到與地景對話,讓您能看到這小鎮的風貌。 *心得 有故事的人和地方,最發人深省,我就是其中之一。當我年輕的時候
Thumbnail
avatar
紫兒佩佩
2023-11-04
柏林城市中的绿林湖泊柏林城市中的绿林湖泊,二战废墟堆起的山丘。能畅快地游泳爬山爬树,就是我喜欢的地方,这地方游泳,别有特色。
Thumbnail
avatar
zhoufengsuO
2023-10-12
城市中的寧靜庇護  城市,是現代生活的繁華樞紐,充斥著喧鬧和忙碌。在這個都市叢林中,每個人都奔波於高樓大廈之間,匆匆忙忙地追求著各自的目標。
avatar
Vic Chen
2023-07-20
【Club Med 出發前】把時間花在生命中意義的事情上。 明天要出發來個三天兩夜的小旅行,一早就先把行李給打包好。 提前將周五要交的翻譯寫好,然後暫時不接新案子。 (有些業主其實挺奇怪的,只要他寄出email的那一個瞬間,他就開始期待你可以馬上翻譯好,好像我都不用吃飯,洗澡,溜狗,煮飯一樣的。) 新品牌還在默默的準備中,每天的商品文案,還有小程序準備
Thumbnail
avatar
台灣太太在北京
2021-12-09
「100」在我人生中的意義        「100」在我人生中意謂著什麼?小時候考試100分,那真是....,「100」在我人生中出現最具“形象”意義的,是在旅行中不經意看到...,如今邁入人生下半場,「100」在我人生中的意義,就這樣鬼使神差地轉變成...
Thumbnail
avatar
littlefish
2021-07-31
佛教於生活中的意義,稍縱即逝的十年│泰小人物誌-แสง(下)在她的媽媽歷經最小的兒子養大後竟被下蠱拐走,這無處宣洩的傷痛使她的媽媽開始吃齋唸佛,有了所謂的信仰。 那แสง(Saeng)呢?不好意思問她是什麼時候開始有信仰,或許小時候就是了,也或許和媽媽一樣,是從某一次的傷痛開始,我只能在心中如此猜想著。
Thumbnail
avatar
泰太
2021-02-25
逆行中的意外驚喜兩次到宜蘭吃早餐,在回程時,出了雪山隧道,發現從坪林、石碇到新店,往宜蘭的車子大排長龍,而反方向而行的我們卻一路順暢。這時候難免就會覺得:什麼是愜意的人生?在不同的時候,選擇不同的方向,到同一個地方,也許就能活得自在一點、有趣一點、愜意一點。
Thumbnail
avatar
王溢嘉
2021-02-25