PHP 异常

原文链接:http://drupal.org/node/608166

PHP 异常
 
基本惯例
1. 异常是类,所以异常类应该像其它类一样遵守标准的面向对象程序设计代码规范
2. 所有的异常都必须以后缀"Exception"作为结束。
3. 所有的异常都必须包含一句恰当的可翻译的字符串作为消息,除非这个异常在引导流程
   过程中抛出的非常早在翻译系统可用之前就被抛出。这种情况是非常少见的。
4. 异常类应该以其相关的子系统和错误类型命名。就像,[Subsystem][ErrorType]Exception.
 
子类异常的使用最好用不同的错误信息来重用一个单一通用的异常类,因为不同的类可以分别被抓取。
 
举例:
<?php
class WidgetNotFoundException extends Exception {}
 
function use_widget($widget_name) {
  $widget = find_widget($widget_name);
 
  if (!$widget) {
    throw new WidgetNotFoundException(t('Widget %widget not found.', array('%widget' => $widget_name)));
  }
}
?>
 
Try-catch 块
Try-catch 块应该遵循类似if-else的换行模式,每个catch代码块都以新的一行开始。
 
举例:
<?php
try {
  $widget = 'thingie';
  $result = use_widget($widget);
 
  // Continue processing the $result.
  // If an exception is thrown by use_widget(), this code never gets called.
}
catch (WidgetNotFoundException $e) {
  // Error handling specific to the absence of a widget.
}
catch (Exception $e) {
  // Generic exception handling if something else gets thrown.
  watchdog('widget', $e->getMessage(), WATCHDOG_ERROR);
}
?>
 
继承
PHP要求所有的异常继承Exception类,要么是直接继承要么是间接继承。
 
当创建一个新的异常类时,它的命名应该参照其相关的子系统和包含的错误信息。
如果给定的子系统包含多个异常,它们应该都延伸于一个通用的基础异常类。
捕捉时可以使用多个捕获模块如果必要。
 
<?php
class FelineException extends Exception {}
 
class FelineHairBallException extends FelineException {}
 
class FelineKittenTooCuteException extends FelineException {}
 
try {
  $nermal = new Kitten();
  $nermal->playWith($string);
}
catch (FelineHairBallException $e) {
  // Do error handling here.
}
catch (FelineKittenTooCuteException $e) {
  // Do different error handling here.
}
catch (FelineException $e) {
  // Do generic error handling here.
}
// Optionally also catch Exception so that all exceptions stop here instead of propagating up.
?>