- Yii Application Development Cookbook(Second Edition)
- Alexander Makarov
- 584字
- 2021-11-12 16:36:11
Using exceptions
Exceptions are a core PHP feature, but they are seldom used fairly. Yii makes exceptions very useful.
There are two main areas where Yii exceptions come in handy, which are as follows:
- Exceptions allow the simplifying of the process of detecting and fixing application errors and special situations, such as database connection failure or API failure
- Exceptions allow the generating of different HTTP responses in a very clean way
Generally, an exception should be thrown when a component cannot handle a special situation, such as the one said earlier, and needs to leave it to higher-level components.
How to do it…
- Let's assume that we have an
application/apis/lyrics/LyricsFinder.php
class that makes an HTTP request to an API using CURL and returns lyrics for a song based on its name. This is how we can use exceptions inside of it:// create some custom exceptions to be able to catch them // specifically if needed // general lyrics finder exception class LyricsFinderException extends CException {} // used when there is a connection problem class LyricsFinderHTTPException extends LyricsFinderException{} class LyricsFinder { private $apiUrl = 'http://example.com/lyricsapi&songtitle=%s'; function getText($songTitle) { $url = $this->getRequestUrl($songTitle); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); // if there is an HTTP error, we'll throw an // exception if($result===false) { $errorText = curl_error($curl); curl_close($url); throw new LyricsFinderHTTPException($errorText); } curl_close($curl); return $result; } private function getRequestUrl($songTitle) { return sprintf($this->apiUrl, urlencode($songTitle)); } }
- As we don't know how a specific application needs to handle its API connection, we will leave it to the application itself by throwing a custom exception
LyricsFinderHTTPException
. This is how we can handle it in ourprotected/controllers/TestController.php
class:class TestController extends CController { public function actionIndex($song) { $lyric = 'Nothing was found.'; // importing api class Yii::import('application.apis.lyrics.LyricsFinder'); $finder = new LyricsFinder(); if(!empty($song)) { // We don't want to show user an error. // Instead we want to apologize and // invite him to try again later. try { $lyric = $finder->getText($song); } // we are looking for specific exception here catch (LyricsFinderHTTPException $e) { echo 'Sorry, we cannot process your request. Try again later.'; } } echo $lyric; } }
- Another usage of Yii exceptions is the generation of different HTTP responses by throwing
CHttpException
. For example, an action that displays a blog post represented by aPost
model loaded by its ID will look like this:class PostController extends CController { function actionView() { if(!isset($_GET['id'])) // If there is no post ID supplied, request is // definitely wrong. // According to HTTP specification its code is 400. throw new CHttpException(400); // Finding a post by its ID $post = Post::model()->findByPk($_GET['id']); if(!$post) // If there is no post with ID specified we'll // generate HTTP response with code 404 Not Found. throw new CHttpException(404); // If everything is OK, render a post $this->render('post', array('model' => $post)); } }
How it works…
Yii converts all non-fatal application errors to CException
automatically.
Additionally, the default exception handler raises either the onError
event or the onException
event. The default event handler writes a log message with the error level set to error
. Additionally, if your application's YII_DEBUG
constant is set to true
, unhandled exceptions or errors will be displayed at a handy error screen. This screen includes a call stack trace, a code area where the exception was raised, and the file and line where you can look for the code to fix.
There's more...
For further information, refer to the following URLs:
- 從區塊鏈到Web3:構建未來互聯網生態
- 新一代物聯網架構技術:分層算力網絡
- SD-WAN架構與技術(第2版)
- 網絡互聯技術(實踐篇)
- 光纖通信系統與網絡(修訂版)
- 物聯網與智能家居
- 夢工廠之材質N次方:Maya材質手冊
- Getting Started with Memcached
- 組網技術與網絡管理
- 數據血緣分析原理與實踐
- Enterprise ApplicationDevelopment with Ext JSand Spring
- 算力網絡:云網融合2.0時代的網絡架構與關鍵技術
- Corona SDK Application Design
- ReasonML Quick Start Guide
- 通信系統實戰筆記:無處不在的信號處理