PHP 異常
什麼是異常?
異常是一個描述 PHP 指令碼錯誤或意外行為的物件。
許多 PHP 函式和類都會丟擲異常。
使用者定義的函式和類也可以丟擲異常。
當函式遇到無法使用的資料時,丟擲異常是停止該函式的好方法。
丟擲異常
throw
語句允許使用者定義的函式或方法丟擲異常。當丟擲異常時,它後面的程式碼將不會執行。
如果異常未被捕獲,將會發生一個致命錯誤,並顯示“未捕獲的異常”訊息。
讓我們嘗試在不捕獲異常的情況下丟擲它
示例
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
echo divide(5, 0);
?>
自己動手試一試 »
結果將類似於:
致命錯誤: 未捕獲的異常: C:\webfolder\test.php:4 中的零除法
堆疊跟蹤: #0 C:\webfolder\test.php(9)
divide(5, 0) #1 {main} 在 C:\webfolder\test.php 的第 4 行丟擲
try...catch 語句
為了避免上面示例中的錯誤,我們可以使用 try...catch
語句來捕獲異常並繼續執行。
語法
try {
可能丟擲異常的程式碼
} catch(Exception $e) {
捕獲到異常時執行的程式碼
}
示例
丟擲異常時顯示訊息
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "無法除法。";
}
?>
自己動手試一試 »
catch 塊指示應該捕獲哪種型別的異常,以及用於訪問該異常的變數名。在上面的示例中,異常型別是 Exception
,變數名是 $e
。
try...catch...finally 語句
可以使用 try...catch...finally
語句來捕獲異常。無論是否捕獲到異常,finally
塊中的程式碼都將始終執行。如果存在 finally
,則 catch
塊是可選的。
語法
try {
可能丟擲異常的程式碼
} catch(Exception $e) {
捕獲到異常時執行的程式碼
} finally {
無論是否捕獲到異常,始終執行的程式碼
}
示例
丟擲異常時顯示訊息,然後指示程序已結束
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $e) {
echo "無法除法。 ";
} finally {
echo "程序完成。";
}
?>
自己動手試一試 »
示例
即使未捕獲到異常,也輸出字串
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero");
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} finally {
echo "程序完成。";
}
?>
自己動手試一試 »
異常物件
異常物件包含有關函式遇到的錯誤或意外行為的資訊。
語法
new Exception(message, code, previous)
引數值
引數 | 描述 |
---|---|
message | 可選。一個描述異常丟擲原因的字串 |
程式碼 | 可選。一個整數,可用於輕鬆區分相同型別的其他異常 |
previous | 可選。如果此異常是在另一個異常的 catch 塊中丟擲的,則建議將該異常傳遞到此引數 |
方法
捕獲異常時,下表顯示了一些可用於獲取有關異常的資訊的方法
方法 | 描述 |
---|---|
getMessage() | 返回一個描述異常丟擲原因的字串 |
getPrevious() | 如果此異常是由另一個異常觸發的,則此方法返回前一個異常。如果不是,則返回 null |
getCode() | 返回異常程式碼 |
getFile() | 返回丟擲異常的檔案的完整路徑 |
getLine() | 返回丟擲異常的程式碼行的行號 |
示例
輸出已丟擲異常的資訊
<?php
function divide($dividend, $divisor) {
if($divisor == 0) {
throw new Exception("Division by zero", 1);
}
return $dividend / $divisor;
}
try {
echo divide(5, 0);
} catch(Exception $ex) {
$code = $ex->getCode();
$message = $ex->getMessage();
$file = $ex->getFile();
$line = $ex->getLine();
echo "Exception thrown in $file on line $line: [Code $code]
$message";
}
?>
自己動手試一試 »
完整的異常參考
有關完整參考,請訪問我們的 完整的 PHP 異常參考。
參考包含所有異常方法的描述和示例。