php错误处理Exception
通常我们希望封装好的类是完整和独立的,不需要从外部干预内部代码的执行,所以依赖程序员另外写代码测试一个类中的方法是否出错,这是非常不合理的。
我们需要把错误处理的责任集中放在类的内部,而不能依赖于调用该类的程序员和外部代码,因为通常使用该类的程序员并不知道怎么处理类内部的方法所引发的错误。
Exception类
一般的写法:
< ?phpclass Server{ function __construct($file) { $this->file = $file; if(!file_exists($file)){ throw new Exception("file '$file' does not exist."); } }}class Client{ static function init() { try{ $conf = new Server(dirname(__FILE__)."/conf01.xml"); //测试用例 $conf->write(); }catch(Exception $e){ print $e; //这里可以打印错误或者做其他事情 } }}Client::init();?>
当抛出异常的时候,调用作用域中国的catch子句会被调用,自动将Exception对象作为参数传入因为异常抛出时会停止执行类的方法,所以此时控制权从try子句移交到catch子句
不过有个问题,就是每次只能获取一个error,因为即使写多了判断然后throw,但也是只能catch一个,毕竟都不能区分,所以需要做一些处理
高级写法
< ?phpclass Server { function __construct($file) { $this->file = $file; if(!file_exists($file)){ throw new FileException("file '$this->file' does not exist."); } } function write() { if(! is_writable($this->file)){ throw new BadException("file '$this->file' is bad."); //测试我将文件改成不能写的权限 chmod 000 conf01.xml } }}class BadException extends Exception{ //需要创建一个新的Exception类,名字是可以diy的,不过需要继承Exception类}class Client{ static function init() { try{ $conf = new Server(dirname(__FILE__)."/conf01.xml"); $conf->write(); }catch(FileException $e){ print $e; }catch(BadException $e){ //这里只执行了一个Exception,不过也是我们的目标的BadException print $e; }catch(Exception $e){ //这里是为了做后备,为了获取一些其他不能确认的Exception print $e; } }}Client::init();?>
结果输出:
exception 'BadException' with message 'file 'Downloads/conf01.xml' is bad.' in Downloads/Untitled.php:15Stack trace:#0 Downloads/Untitled.php(28): Server->write()#1 /Downloads/Untitled.php(39): Client::init()#2 {main}
需要注意的是,catch是会按照顺序来匹配的,如果前一个被匹配了,后面都就不会被触发。
继承exception类,还可以自定义自己的输出
< ?phpclass Server { function __construct($file) { $this->file = $file; if(!file_exists($file)){ throw new FileException("file '$this->file' does not exist."); } } function write() { if(! is_writable($this->file)){ throw new BadException("file '$this->file' is not writeable."); } if(! is_readable($this->file)){ throw new SpecilException($this->file); } }}class BadException extends Exception{}class SpecilException extends Exception{ function __construct($file){ //这里可以创建一些自己的Exception规则,而不单纯是支持打印错误 echo "this is a Specil error,'$file' is not readable"; }}class Client{ static function init() { try{ $conf = new Server(dirname(__FILE__)."/conf01.xml"); $conf->write(); }catch(FileException $e){ print $e; }catch(BadException $e){ print $e; }catch(SpecilException $e){ //我将测试文件改成不能读的状态来测试 print $e; }catch(Exception $e){ print $e; } }}Client::init();?>
输出结果:
this is a Specil error,'/Downloads/conf01.xml' is not readableexception 'SpecilException' in/Downloads/Untitled.php:19Stack trace:#0 /Downloads/Untitled.php(40): Server->write()#1 /Downloads/Untitled.php(53): Client::init()#2 {main}

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸
