異常的定義
處理異常實現
try {
$error = 'this is error';
throw new Exception($error); // 在try裏面拋出一個異常對象,這個對象的構造函數參數是一個字符串
} catch (Exception $e) {
echo 'Caught exception' . $e->getMessage(); // 對異常處理
}
echo "process continue" // 異常處理後,程序不會中斷,會繼續執行
注意:拋出一個異常對象,對象的實例化參數是一個字符串
處理錯誤和異常的區別
function buySomething()
{
if (checkMoney()) {
return "金幣不足";
}
}
這個程序的問題是中斷了程序的執行。因爲我不僅要提示玩家金幣不足,還可能需要引導用戶充值,或者進行其他某些操作。還有一個更重要的問題是,函數嵌套調用的時候,如函數的調用關係:foo1()->foo2()->foo3()->fooN()。如果類似於fooN函數中每個都有錯誤返回值,這個可以看出錯誤處理的問題是:
2)每次都要判斷一下是否錯誤.
3)還要處理不是自己的錯誤.
4) 每一級都要重複處理.
5) 還要知道被調用者將會調用什麼, 會返回什麼錯誤。
捕獲多個異常
class Core_Exception_Logic extends Core_Exception_Abstract
{
}
捕獲多個異常
function dealException()
{
// 獲取到異常對象
$e = $this->_request->getException();
if (! $e instanceof Exception) {
_exit('Access Denied');
}
try {
throw $e;
} catch (Core_Exception_403 $e) {
if (! isDebug()) {
header403();
}
} catch (Core_Exception_404 $e) {
header404();
} catch (Core_Exception_Logic $e) {
// 邏輯異常處理方式
}
return false;
}
異常處理方式
catch (Core_Exception_Logic $e) {
if ($this->isAjax()) {
$this->jsonx($e->getMessage(), 'error');
} else {
_exit($e->getMessage());
}
}
知識點:
public function isXmlHttpRequest()
{
return (strcasecmp(
$this->getServer('HTTP_X_REQUESTED_WITH'),
'XMLHttpRequest'
) ==0 ? true:false);
}
2)關於Json生成代碼
public function json(array $output)
{
header('Content-type: text/json');
header('Content-type: application/json; charset=UTF-8');
exit(json_encode($output));
}
異常的集中捕獲
public function run($controllerPath = 'Controller')
{
try {
// 插件調用:路由解析前
Core_Plugin_Broker::invoke('routerStartup');
// 路由解析,設置當前分發信息
$this->setDispatchInfo(null);
if (!$this->_dispatchInfo) {
throw new Core_Exception_Fatal('No dispatchInfo found');
}
// 插件調用:路由解析後
Core_Plugin_Broker::invoke('routerShutdown');
// 插件調用:循環分發前
Core_Plugin_Broker::invoke('dispatchLoopStartup');
do {
$this->_dispatched = true;
// 插件調用:分發前
Core_Plugin_Broker::invoke('preDispatch');
// 執行分發
Core_Dispatcher::getInstance()->dispatch($this->_dispatchInfo, $controllerPath);
// 插件調用:分發後
Core_Plugin_Broker::invoke('postDispatch');
} while (!$this->_dispatched);
// 插件調用:循環分發後
Core_Plugin_Broker::invoke('dispatchLoopShutdown');
} catch (Exception $e) {
if ($this->_isCli) {
exit($e);
}
// 錯誤、異常處理控制器
$dispatchInfo = array(
'controller' => 'Error',
'action' => 'error',
'params' => array(
'exception' => $e,
),
);
Core_Dispatcher::getInstance()->dispatch($dispatchInfo, $controllerPath);
}
}
在程序執行入口處捕獲,這樣,就可以捕獲到所有的異常,同時把捕獲到的異常重新分發到一個集中的控制器裏面處理(即採用捕獲多個異常的方式)。這樣既可以避免異常未捕獲的問題,又可以減少許多代碼,保證代碼的整潔。
頁面處理返回的異常信息
$._get(href, function (resp) {
// 如果響應內容是JSON格式,說明在PHP拋了異常
if (typeof resp == 'object' && resp.status != undefined) {
// 優先處理一遍 _getJSON 的響應結果
if (! handlePriorAjaxResponse(resp)) {
return false;
}
}
});
異常處理的流程: