设为首页 收藏本站
查看: 676|回复: 0

[经验分享] php错误处理和php异常处理机制

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-3-19 11:28:10 | 显示全部楼层 |阅读模式
 php错误处理
  当我们开发程序时,有时候程序出现了问题,我们就可以用以下几种办法找出错误。
  开发阶段:开发时输出所有的错误报告,有利于我们进行程序调试
  运行阶段:我们不要让程序输出任何一种错误报告(不能让用户看到(包括懂技术, 不懂技术的人))
  将错误报告写入日志中
  一、指定错误报告 error_reporting = E_LL
  二、关闭错误输出 display_errors = Off
  三、开启错误日志功能 log_errors = On
  1. 默认如果不指定错误日志位置,则默认写WEB服务器的日志中
  2. 为error_log选项指定 一个文件名(可写)
  3. 写入到操作系统日志中error_log=syslog
  以下代码示例
  <?php
  // error_reporting(E_ALL);
  /// ini_set("display_errors", "off");
  // ini_set("error_log", "syslog");
  // ini_set("MAX_FILEUPLOAD", 200000000);
  // echo ini_get("upload_max_filesize");
  // error_log("this is a error message!!!!");
  getType($var); //注意
  getType(); //警告
  getTye(); //错误 会终止程序运行
  echo "###########################<br>";
  ?>
  当然php还提供了函数error_get_last()来获得错误信息
  函数定义和用法
  error_get_last()函数获取最后发生的错误。该函数以数组的形式返回最后发生的错误。返回的数组包含 4 个键和值: [type] - 错误类型 [message] - 错误消息 [file] - 发生错误所在的文件 [line] - 发生错误所在的
  小例子:
  <?php echo $test; print_r(error_get_last()); ?>输出:
  Array ( [type] => 8 [message] => Undefined variable: test [file] => D:\www\test.php [line] => 2 )
  所以这样我们也很方便了…这样是不是对调试程序和排查错误的时候很有帮助呢?
  这些错误报告级别是错误处理程序旨在处理的错误的不同的类型:
  值 常量 描述托福答案 www.yztrans.com
  2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
  8 E_NOTICE Run-time 通知。
  脚本发现可能有错误发生,但也可能在脚本正常运行时发生。
  256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR.
  512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING.
  1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE.
  4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
  8191 E_ALL 所有错误和警告,除级别 E_STRICT 以外。
  (在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)
  php异常处理机制
  定义:
  异常处理: 意外,是在程序运行过程中发生的意料这外的事,使用异常改变脚本正常流程
  语法格式:
  try
  { //…}
  catch(Exception $e)
  { //…}
  PHP中try{}catch{}是异常处理。
  将要执行的代码放入TRY块中,如果这些代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示。
  PHP中try{}catch{}语句
  为了进一步处理异常,我们需要使用PHP中try{}catch{}----包括Try语句和至少一个的catch语句。任何调用 可能抛出异常的方法的代码都应该使用try语句。Catch语句用来处理可能抛出的异常。
  例子:
  我写一段代码:
  自己定义一个异常类
  作用:就是写一个或多个方法解决当发生这个异常时的处理方式
  1. 自己定义异常类,必须是Exception(内置类)的子类, 可以查看PHP手册里面Exception(内置类)的使用方法
  2. Exception类中的只有构造方法和toString()可以重写, 其它都final
  <?php
  class OpenFileException extends Exception { //继承PHP的内置类
  function __construct($message = null, $code = 0){
  parent::__construct($message, $code);
  echo "wwwwwwwwwwwwwww<br>";
  }
  function open(){
  touch("tmp.txt");
  $file=fopen("tmp.txt", "r");
  return $file;
  }
  }
  ?>
  1. 如果try中代码没有问题,则将try中代码执行完后就到catch后执行
  2. 如果try中代码有异常发生,则抛出一个异常对象(使用throw),抛出给了catch中的参数, 则在try中代码就不会再继续执行下去 直接跳转到catch中去执行, catch中执行完成, 再继续向下执行
  注意: 提示发生了什么异常,这不是主要我们要做事,需要在catch中解决这个异常, 如果解决不了,则出去给用户在下面代码中,如果我没有这个TMP.TXT文件的话,就会抛出异常了。
  如果有异常,我们调用OPEN方法就可以解决这个异常了。
  <?php
  try{
  $file=fopen("tmp.txt", "r"); // 尝试读取这个文件
  if(!$file)
  throw new OpenFileException("文件打开失败"); //如果文件不存在则抛出异常
  }catch(OpenFileException $e){ //$e =new Exception();
  echo $e->getMessage()。"<BR>"; //getMessage() 是PHP里面内置的方法,可以直接调用
  $file=$e->open();
  }
  下面将代码进行整理以及多个异常处理方法:
  <?php
  /*
  * 异常处理: 意外,是在程序运行过程中发生的意料这外的事,使用异常改变脚本正常流程
  *
  * PHP5中的一个新的重要特性
  *
  * if(){
  *
  * }else{
  *
  * }
  *
  * try {
  *
  * }catch(异常对象){
  *
  * }
  *
  * 1. 如果try中代码没有问题,则将try中代码执行完后就到catch后执行
  * 2. 如果try中代码有异常发生,则抛出一个异常对象(使用throw),抛出给了catch中的参数, 则在try中代码就不会再继续执行下去
  * 直接跳转到catch中去执行, catch中执行完成, 再继续向下执行 www.jx-jf.com
  *
  *
  * 注意: 提示发生了什么异常,这不是主要我们要做事,需要在catch中解决这个异常, 如果解决不了,则出去给用户
  *
  * 二、自己定义一个异常类
  *
  * 作用:就是写一个或多个方法解决当发生这个异常时的处理方式
  *
  * 1. 自己定义异常类,必须是Exception(内置类)的子类,
  * 2. Exception类中的只有构造方法和toString()可以重写, 其它都final
  *
  * 三、处理多个异常
  *
  *
  * 自己定义功能类时如果在方法中抛出异常
  *
  *
  */
  class OpenFileException extends Exception {
  function __construct($message = null, $code = 0){
  parent::__construct($message, $code);
  echo "wwwwwwwwwwwwwww<br>";
  }
  function open(){
  touch("tmp.txt");
  $file=fopen("tmp.txt", "r");
  return $file;
  }
  }
  class DemoException extends Exception {
  function pro(){
  echo "处理demo发生的异常<br>";
  }
  }
  class TestException extends Exception {
  function pro(){
  echo "这里处理test发生的异常<br>";
  }
  }
  class HelloException extends Exception {
  }
  class MyClass {

  function openfile(){

  $file=@fopen("tmp.txt", "r");

  if(!$file)

  throw new OpenFileException("文件打开失败");

  }

  function demo($num=0){

  if($num==1)

  throw new DemoException("演示出异常");

  }

  function test($num=0){

  if($num==1)

  throw new TestException("测试出错");

  }

  function fun($num=0){

  if($num==1)

  throw new HelloException("###########");

  }

  }

  try{

  echo "11111111111111<br>";

  $my=new MyClass();

  $my->openfile();

  $my->demo(0);

  $my->test(0);

  $my->fun(1);

  echo "22222222222222222<BR>";

  }catch(OpenFileException $e){ //$e =new Exception();

  echo $e->getMessage()。"<BR>";

  $file=$e->open();

  }catch(DemoException $e){

  echo $e->getMessage()。"<BR>";

  $e->pro();

  }catch(TestException $e){

  echo $e->getMessage()。"<BR>";

  $e->pro();

  }catch(Exception $e){

  echo $e->getMessage()。"<BR>";

  }

  var_dump($file);

  echo "444444444444444444444<BR>";

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-15939-1-1.html 上篇帖子: php操作文件出错-failed to open stream: Permission denied 下篇帖子: 关于PHP中解析域名不成功的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表