異常是許多流行編程語言的標配,但它們往往被 PHP 開發人員所忽視。像 Ruby 就是一個極度重視異常的語言,無論有什么錯誤發生,像是 HTTP 請求失敗,或者數據庫查詢有問題,甚至找不到一個圖片資源,Ruby (或是所使用的 gems),將會拋出異常,你可以通過屏幕立刻知道所發生的問題。
PHP 處理這個問題則比較隨意,調用 `file_get_contents()` 函數通過只會給出 `FALSE `值和警告。許多較早的 PHP 框架比如 CodeIgniter 只是返回 false,將信息寫入專有的日志,或者讓你使用類似 `$this->upload->get_error()` 的方法來查看錯誤原因。這里的問題在于你必須找出錯誤所在,并且通過翻閱文檔來查看這個類使用了什么樣的錯誤的方法,而不是明確的暴露錯誤。
另一個問題發生在當類自動拋出錯誤到屏幕時會結束程序。當這樣做時會阻擋其他開發者動態處理錯誤的機會。應該拋出異常讓開發人員意識到錯誤的存在,讓他們可以選擇處理的方式,例如:
~~~
<?php
$email = new Fuel\Email;
$email->subject('My Subject');
$email->body('How the heck are you?');
$email->to('guy@example.com', 'Some Guy');
try
{
$email->send();
}
catch(Fuel\Email\ValidationFailedException $e)
{
// 驗證失敗
}
catch(Fuel\Email\SendingFailedException $e)
{
// 這個驅動無法發送 email
}
finally
{
// 無論拋出什么樣的異常都會執行,并且在正常程序繼續之前執行
}
~~~
### SPL 異常
原生的 Exception 類并沒有提供太多的調試情境給開發人員,不過可以通過建立一個特殊的 Exception 來彌補它,方式就是建立一個繼承自原生 Exception 類的一個子類:
~~~
<?php
class ValidationException extends Exception {}
~~~
如此一來,可以加入多個 catch 區塊,并且根據不同的異常分別處理。通過這樣可以建立 許多自定義異常,其中有些已經在 [SPL 擴展](http://laravel-china.github.io/#standard_php_library) 提供的 SPL 異常中定義了。
舉例來說,如果你使用了 `__call()` 魔術方法去調用一個無效的方法,而不是拋出一個模糊的標準 Exception 或是建立自定義的異常處理,你可以直接拋出 `throw new BadMethodCallException;`。
* [Read about Exceptions](http://php.net/language.exceptions)
* [Read about SPL Exceptions](http://php.net/spl.exceptions)
* [Nesting Exceptions In PHP](http://www.brandonsavage.net/exceptional-php-nesting-exceptions-in-php/)
* [Exception Best Practices in PHP 5.3](http://ralphschindler.com/2010/09/15/exception-best-practices-in-php-5-3)
- 歡迎
- 入門指南
- 使用當前穩定版本
- 內置的WEB服務器
- Mac安裝
- Windows安裝
- 代碼風格指南
- 語言亮點
- 編程范式
- 命名空間
- PHP標準庫
- 命令行接口
- Xdebug
- 依賴管理
- Composer 與 Packagist
- PEAR
- 開發實踐
- 基礎知識
- 日期和時間
- 設計模式
- 使用UTF8編碼
- 依賴注入
- 基本概念
- 復雜的問題
- 容器
- 延伸閱讀
- 數據庫
- MYSQL 擴展
- PDO 擴展
- 數據庫交互
- 數據庫抽象層
- 使用模板
- 好處
- 原生PHP模板
- 編譯模板
- 延伸閱讀
- 錯誤與異常
- 錯誤
- 異常
- 安全
- Web應用程序安全
- 密碼哈希
- 數據過濾
- 配置文件
- 注冊全局變量
- 錯誤報告
- 測試
- 測試驅動開發
- 行為驅動開發
- 其他測試工具
- 服務器與部署
- Platform as a Service (PaaS)
- 虛擬或專用服務器
- 共享服務器
- 構建及部署應用
- 虛擬化
- Vagrant
- Docker
- 緩存
- Opcode緩存
- 對象緩存
- 文檔撰寫
- 資源
- 社區
- Credits