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