---
# System prepended metadata

title: 第七章 錯誤處理
tags: [Tag(Clean Code)]

---

# 第七章 錯誤處理

###### tags: `Tag(Clean Code)`

[TOC]

## 大綱

撰寫錯誤處理的原因是，如果程式發生異常時，仍需要讓程式碼做它該做的事情。

但是，散亂的錯誤處理程式碼，反而會導致我們不意理解程式碼真正的意圖，會模糊了程式碼原本的邏輯，書中會提出技巧和考慮的地方。


---

### 使用例外事件而非回傳錯誤碼

寫程式一定會碰到需要例外處理的情況，有時候我們會選擇定義不同的訊息 FLAG 處理例外，但是一旦 FLAG 越來越多，而且不斷得使用巢狀 if-else 的方式抓取錯誤，程式碼看起來就越來越雜亂。


---

### 在開頭時就寫下 try-except-finally 的敘述

如果你的程式可能會拋出例外，該是開發者預先知道的，都須養成讓try-catch-finally成為開頭敘述的好習慣

---


#### 1. 使用不檢查型例外


[關於 Exception 與 Error 的基本概念](https://https://medium.com/@clu1022/java%E7%AD%86%E8%A8%98-exception-%E8%88%87-error-dbdf9a9b0909)

---


###  提供發生例外的相關知訊 ＆ 從呼叫者的角度定義例外類別

產生有益的錯誤訊息，隨著例外訊息一起傳遞。

包含: 哪個操作發生錯誤、錯誤型態


![](https://i.imgur.com/RpXCu12.png)


當InvalidPacketException的實例被產生的時候（90、101、103行），並不是直接丟出一個空的InvalidPacketException，而是會將「Read data length error」、「Data underflow」、「Read data body error」以及原始的錯誤物件等例外發生相關資訊一併回傳

---

### 定義正常的程式流程

不要用例外來處理一般商業邏輯。

### 不要傳遞 null (空值)

NullPointerException 機率降到最低


回傳 null 時，是在給自己增加額外的工作量，也是在給呼叫者找麻煩，只要有一處忘記檢查 null ，就會導致NullPointerException


