什么是異常處理異常處理的特點
什么是異常處理異常處理的特點
異常處理是編程語言或計算機硬件里的一種機制,用于處理軟件或信息系統(tǒng)中出現(xiàn)的異常狀況,那么你對異常處理了解多少呢?以下是由學習啦小編整理關于什么是異常處理的內(nèi)容,希望大家喜歡!
異常處理的概述
各種編程語言在處理異常方面具有非常顯著的不同點(錯誤檢測與異常處理區(qū)別在于:錯誤檢測是在正常的程序流中,處理不可預見問題的代碼,例如一個調用操作未能成功結束)。某些編程語言有這樣的函數(shù):當輸入存在非法數(shù)據(jù)時不能被安全地調用,或者返回值不能與異常進行有效的區(qū)別。例如,C語言中的atoi函數(shù)(ASCII串到整數(shù)的轉換)在輸入非法時可以返回0。在這種情況下編程者需要另外進行錯誤檢測(可能通過某些輔助全局變量如C的errno),或進行輸入檢驗(如通過正則表達式),或者共同使用這兩種方法。
通過異常處理,我們可以對用戶在程序中的非法輸入進行控制和提示,以防程序崩潰。
從進程的視角,硬件中斷相當于可恢復異常,雖然中斷一般與程序流本身無關。
從子程序編程者的視角,異常是很有用的一種機制,用于通知外界該子程序不能正常執(zhí)行。如輸入的數(shù)據(jù)無效(例如除數(shù)是0),或所需資源不可用(例如文件丟失)。如果系統(tǒng)沒有異常機制,則編程者需要用返回值來標示發(fā)生了哪些錯誤。
異常處理的特點
1.在應用程序遇到異常情況(如被零除情況或內(nèi)存不足警告)時,就會產(chǎn)生異常。
2.發(fā)生異常時,控制流立即跳轉到關聯(lián)的異常處理程序(如果存在)。
3.如果給定異常沒有異常處理程序,則程序將停止執(zhí)行,并顯示一條錯誤信息。
4.可能導致異常的操作通過 try 關鍵字來執(zhí)行。
5.異常處理程序是在異常發(fā)生時執(zhí)行的代碼塊。在 C# 中,catch 關鍵字用于定義異常處理程序。
6.程序可以使用 throw 關鍵字顯式地引發(fā)異常。
7.異常對象包含有關錯誤的詳細信息,其中包括調用堆棧的狀態(tài)以及有關錯誤的文本說明。
8.即使引發(fā)了異常,finally 塊中的代碼也會執(zhí)行,從而使程序可以釋放資源。
php異常處理的方法
擴展 php 內(nèi)置的異常處理類
用戶可以用自定義的異常處理類來擴展 php 內(nèi)置的異常處理類。以下的代碼說明了在內(nèi)置的異常處理類中,哪些屬性和方法在子類中是可訪問和可繼承的。譯者注:以下這段代碼只為說明內(nèi)置異常處理類的結構,它并不是一段有實際意義的可用代碼。
內(nèi)置的異常處理類
<?php class Exception { protected $message = 'Unknown exception' ; // 異常信息 protected $code = 0 ; // 用戶自定義異常代碼 protected $file ; // 發(fā)生異常的文件名 protected $line ; // 發(fā)生異常的代碼行號 function __construct $message = null $code = 0 ); final function getMessage (); // 返回異常信息 final function getCode (); // 返回異常代碼 final function getFile (); // 返回發(fā)生異常的文件名 final function getLine (); // 返回發(fā)生異常的代碼行號 final function getTrace (); // backtrace() 數(shù)組 final function getTraceAsString (); // 已格成化成字符串的 getTrace() 信息 /* 可重載的方法 */ function __toString (); // 可輸出的字符串 } ?>如果使用自定義的類來擴展內(nèi)置異常處理類,并且要重新定義構造函數(shù)的話,建議同時調用 parent::__construct() 來檢查所有的變量是否已被賦值。當對象要輸出字符串的時候,可以重載 __toString() 并自定義輸出的樣式。
擴展 php 內(nèi)置的異常處理類
<?php /** * 自定義一個異常處理類 */ class MyException extends Exception{ // 重定義構造器使 message 變?yōu)楸仨毐恢付ǖ膶傩?public function __construct( $message $code = 0 ) { , // 自定義的代碼 // 確保所有變量都被正確賦值 parent:: __construct ( $message $code ); } // 自定義字符串輸出的樣式 */ public function __toString () { return __CLASS__ . ": [{ $this -> code }] : {$this->message }/n " ; } public function customFunction () { echo "A Custom function for this type of exception/n" ; }} /** * 創(chuàng)建一個用于測試異常處理機制的類 */class TestException { public $var ; const THROW_NONE = 0 ; const THROW_CUSTOM = 1 ; const THROW_DEFAULT = 2 ; function __construct( $avalue = self :: THROW_NONE ) { switch ( $avalue ) { case self :: THROW_CUSTOM : // 拋出自定義異常 throw new MyException ( '1 is an invalid parameter' 5 ); break; case self:: THROW_DEFAULT: // 拋出默認的異常 throw new Exception ( '2 isnt allowed as a parameter' 6 ); break; default: // 沒有異常的情況下,創(chuàng)建一個對象 $this var = $avalue ; break; } }}
看過“異常處理的特點”的人還看了: