PHP预定了两个异常类:Exception和ErrorException
<br />Exception {<br /> /* 属性 */<br /> protected string $message ; //异常消息内容<br /> protected int $code ; //异常代码号<br /> protected string $file ; //抛出异常的文件名<br /> protected int $line ; //抛出异常在该文件中的行号<br /> /* 方法 */<br /> public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = null]]] )<br /> final public string getMessage ( void ) //异常抛出的信息<br /> final public Exception getPrevious ( void ) //前一异常<br /> final public int getCode ( void ) //异常代码,这是用户自定义的<br /> final public string getFile ( void ) //发生异常的文件路劲<br /> final public int getLine ( void ) //发生异常的行<br /> final public array getTrace ( void ) //异常追踪信息(array)<br /> final public string getTraceAsString ( void ) //异常追踪信息(string)<br /> public string __toString ( void ) //试图直接 将异常对象当作字符串使用时调用子函数的返回值<br /> final private void __clone ( void ) //克隆异常对象时调用<br />}<br />
<br />ErrorException extends Exception {<br /> <br /> /* 属性 */<br /> protected int $severity ;<br /> /* 方法 */<br /> <br /> public __construct ([ string $message = "" [, int $code = 0 [, int $severity = 1 [, string $filename = __FILE__ [, int $lineno = __LINE__ [, Exception $previous = NULL ]]]]]] )<br /> final public int getSeverity ( void )<br /> /* 继承的方法 */<br /> final public string Exception::getMessage ( void )<br /> final public Exception Exception::getPrevious ( void )<br /> final public int Exception::getCode ( void )<br /> final public string Exception::getFile ( void )<br /> final public int Exception::getLine ( void )<br /> final public array Exception::getTrace ( void )<br /> final public string Exception::getTraceAsString ( void )<br /> public string Exception::__toString ( void )<br /> final private void Exception::__clone ( void )<br />}<br />
那么如何捕获异常?
(1)PHP可用try…catch…捕获异常,进行异常处理的代码必须在try代码块内。
<br />try {<br /> throw new Exception('exception test 1', 1001);<br />} catch(Exception $e) {<br /> echo $e->getMessage().'-'.$e->getCode();<br />}<br />
(2)用户可以自定义异常处理函数[set_exception_handler],用于没用用try/catch捕获的异常。
<br />function exception_handler ( $e ) {<br /> echo "Uncaught exception: " , $e -> getMessage (), "\n" ;<br />}<br /> <br />set_exception_handler ( 'exception_handler' );<br /> <br />throw new Exception ( 'Uncaught Exception' );<br /> <br />echo "这行不会执行了";<br />
可以看到使用ser_exception_handler回调函数处理异常,后续的代码不会继续执行,但try-catch可以。
(3)PHP可用多catch捕获不同类型异常,并允许在catch代码块内再次抛出异常。
<br />//请根据实际扩展异常类<br />class MyException extends Exception {<br /> public function __construct($message = '', $code = 0) {<br /> <br /> }<br /> <br /> public function myFunction<b style="color:transparent">来&源gao@dai!ma.com搞$代^码%网</b><img>搞gaodaima代码</img>() {<br /> echo 'just for test';<br /> }<br />}<br /> <br />try {<br /> throw new MyException('an error');<br />} catch (MyException $e) {<br /> echo $e->myFunction();<br />} catch (Exception $e) {<br /> echo $e->getMessage();<br />}<br />
(4)PHP5.5已经支持finally关键词,你无需关心异常是否溢出了。
可对比如下:
<br />function doSomething() {<br /> $resource = createResource();<br /> try {<br /> $result = useResource($resource);<br /> } catch (Exception $e) {<br /> releaseResource($resource);<br /> log($e->getMessage());<br /> exit();<br /> }<br /> releaseResource($resource);<br /> return $result;<br />}<br /> <br />//使用finally后<br />function doSomething2() {<br /> $resource = createResource();<br /> try {<br /> $result = useResource($resource);<br /> return $result;<br /> } catch (Exception $e) {<br /> log($e->getMessage());<br /> exit();<br /> } finally {<br /> releaseResource($resource);<br /> }<br />}<br />