PHP异常处理浅析
程序员文章站
2023-11-21 11:06:46
php预定了两个异常类:exception和errorexception
复制代码 代码如下:
exception {
/* 属...
php预定了两个异常类:exception和errorexception
复制代码 代码如下:
exception {
/* 属性 */
protected string $message ; //异常消息内容
protected int $code ; //异常代码号
protected string $file ; //抛出异常的文件名
protected int $line ; //抛出异常在该文件中的行号
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, exception $previous = null]]] )
final public string getmessage ( void ) //异常抛出的信息
final public exception getprevious ( void ) //前一异常
final public int getcode ( void ) //异常代码,这是用户自定义的
final public string getfile ( void ) //发生异常的文件路劲
final public int getline ( void ) //发生异常的行
final public array gettrace ( void ) //异常追踪信息(array)
final public string gettraceasstring ( void ) //异常追踪信息(string)
public string __tostring ( void ) //试图直接 将异常对象当作字符串使用时调用子函数的返回值
final private void __clone ( void ) //克隆异常对象时调用
}
复制代码 代码如下:
errorexception extends exception {
/* 属性 */
protected int $severity ;
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, int $severity = 1 [, string $filename = __file__ [, int $lineno = __line__ [, exception $previous = null ]]]]]] )
final public int getseverity ( void )
/* 继承的方法 */
final public string exception::getmessage ( void )
final public exception exception::getprevious ( void )
final public int exception::getcode ( void )
final public string exception::getfile ( void )
final public int exception::getline ( void )
final public array exception::gettrace ( void )
final public string exception::gettraceasstring ( void )
public string exception::__tostring ( void )
final private void exception::__clone ( void )
}
那么如何捕获异常?
(1)php可用try...catch...捕获异常,进行异常处理的代码必须在try代码块内。
复制代码 代码如下:
try {
throw new exception('exception test 1', 1001);
} catch(exception $e) {
echo $e->getmessage().'-'.$e->getcode();
}
(2)用户可以自定义异常处理函数[set_exception_handler],用于没用用try/catch捕获的异常。
复制代码 代码如下:
function exception_handler ( $e ) {
echo "uncaught exception: " , $e -> getmessage (), "\n" ;
}
set_exception_handler ( 'exception_handler' );
throw new exception ( 'uncaught exception' );
echo "这行不会执行了";
可以看到使用ser_exception_handler回调函数处理异常,后续的代码不会继续执行,但try-catch可以。
(3)php可用多catch捕获不同类型异常,并允许在catch代码块内再次抛出异常。
复制代码 代码如下:
//请根据实际扩展异常类
class myexception extends exception {
public function __construct($message = '', $code = 0) {
}
public function myfunction() {
echo 'just for test';
}
}
try {
throw new myexception('an error');
} catch (myexception $e) {
echo $e->myfunction();
} catch (exception $e) {
echo $e->getmessage();
}
(4)php5.5已经支持finally关键词,你无需关心异常是否溢出了。
可对比如下:
复制代码 代码如下:
function dosomething() {
$resource = createresource();
try {
$result = useresource($resource);
} catch (exception $e) {
releaseresource($resource);
log($e->getmessage());
exit();
}
releaseresource($resource);
return $result;
}
//使用finally后
function dosomething2() {
$resource = createresource();
try {
$result = useresource($resource);
return $result;
} catch (exception $e) {
log($e->getmessage());
exit();
} finally {
releaseresource($resource);
}
}