php面向对象视频笔记之第五章(错误和异常处理)

这篇博客介绍了PHP面向对象编程中关于错误和异常处理的一个实例,涉及用户登录场景。内容包括如何验证用户名和密码的长度,确保它们在3到8个字符之间。
摘要由CSDN通过智能技术生成
1、php.ini中配置错误消息
1-1、在php.ini中error_reporting控制输出到用户端的消息种类
     error_reporting = E_ALL;//设置向php报告发生的错误类型
     display_errors = Off;   //设置错误是否显示在客户端
     log_errors = On;        //开启日志记录
     error_log = "d://wamp/logs/php_error.log";//错误日志记录文件
1-2、配置值
     http://php.net/manual/zh/errorfunc.constants.php
     除了在php.ini文件中可以调整错误消息的显示级别外,在php代码中也可以自定义消息显示的级别。
使用error_reporting()函数。
   error_reporting(E_ALL & ~E_NOTICE);//显示除了E_NOTICE之外的所有错误信息。
<=>error_reporting(E_ALL ^ E_NOTICE);
开发过程中建议全部开启即 error_reporting(E_ALL);
线上过程中全部关闭即 error_reporting(0);
1-3、默认处理
在php中,对于错误处理非常的宽松。php系统会尽量让程序运行下去,除非遇到致命错误。
直接打印一个未赋值变量$t时候,系统报出一个Notice,未定义变量。
做除以0的运算时,系统报出一个Warning,提示有除以0这样的警告,程序依然在运行。
当实例化一个不存在的类的时候,发生致命错误,程序终止运行。
1-4、自定义处理
function error_handler($errno,$errmsg,$errfile,$errline){
   switch($errno){
     case E_USER_ERROR:
      echo '自定义错误处理类型:['.$errno.'],错误消息:'.$errmsg.'<br />';
      echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
      break;
     case E_WARNING:
      echo '自定义的警告:['.$errno.'],错误消息:'.$errmsg.'<br />';
      echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
      break; 
     case E_NOTICE:
      echo '自定义的NOTICE:['.$errno.'],错误消息:'.$errmsg.'<br />';
      echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
      break;
     default:
      echo '自定义的警告:['.$errno.'],错误消息:'.$errmsg.'<br />';
      echo '产生的错误的文件:'.$errfile.',所在行是:'.$errline.'<br />';
      break;
   }
}

    set_error_handler('error_handler')函数向系统声明错误处理函数。
    使用trigger_error()函数,可以触发一个 error。
    例如trigger_error("你输入的年龄必须大于0",E_USER_ERROR),触发自己的错误信息。


2、异常捕获和处理
2-1、php中的异常捕获和处理
扩展php内置的异常处理类;可以通过实例化 Exception 类或者它的子类来创建一个异常实例。
http://php.net/manual/zh/class.exception.php
异常处理功能提供了处理程序运行时出现的错误或异常情况的方法。
php5提供了一种新的面向对象的错误处理方法。使用检测(try)、抛出(throw)和捕获(catch)异常。
Try-使用异常的函数应该位于"try"代码块内。如果没有触发异常,则代码将照常继续执行。但是如果
异常被触发,会抛出一个异常。
Throw-这里规定如何触发异常。每一个"throw"必须对应至少一个"catch"。
Catch-"catch"代码块会捕获异常,并创建一个包含异常信息的对象。
一个try至少要有一个与之对应的catch。定义多个catch可以捕获不同的对象。php会按这些catch被定
义的顺序执行,直到完成最后一个为止。而在这些try内,又可以抛出新的异常。try中嵌套try..catch。
2-2、自定义异常
注意事项:
自定义的异常必须继承自Exception类或它的子类。
自定义的异常要重新定义构造函数的话,建议同时调用parent::__construct($msg,$code)来检测所有的变量是否已被
赋值。
当对象要输出字符串的时候,可以重载__toString()并自定义输出的样式。
设置顶层异常处理器:
set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数。
set_exception_handler('exFun');
function exFun(Exception $e){
  echo $e->getMessage();
}

3、异常处理实例

实例功能:
php实现用户登录并对用户名和密码长度进行验证。
验证规则:用户名和密码长度必须在3-8位之间。

index.php

<?php
session_start();
$validata_username = isset($_SESSION['validata_username'])?$_SESSION['validata_username']:'';
$validata_password = isset($_SESSION['validata_password'])?$_SESSION['validata_password']:'';
?>
<html>
 <head>
    <meta charset="utf-8"/>
	<title>用户登录</title>
 </head>
 <body>
    <h1>用户登录</h1>
	<form action="login.php" method="post">
	  用户名:<input type="text" name="username" value=""/> <font color="red"><?php echo $validata_username; ?></font>
	  <br /><br />
	  密 码:<input type="text" name="password" value=""/> <font color="red"><?php echo $validata_password; ?></font>
	  <br /><br />
	  <input type="submit" value="提交"/>
    </form>
 </body>
</html>
login.php

<?php

 session_start();
 //print_r($_POST);

 $username = $_POST['username'];
 $password = $_POST['password'];
 //echo $username,'=>',$password;

 $user = new User($username,$password);
 //判断是否登录成功
 try{
   Validata::validataUser($user);
   //验证通过,登录成功
   $_SESSION['username'] = $username;
   header('Location:main.php');
 } catch(MyException $me){
   header('Location:index.php');
 }
//自动加载类的函数
 function __autoload($class)
 {
   $file = __DIR__.'/'.strtolower($class).'.php';
   if(is_file($file)){
     include_once $file;
   }
   return '';
 }
user.php

<?php

class User{
   private $username;
   private $password;

   function __construct($username,$password) {
      $this->username = $username;
	  $this->password = $password;
   }

   function getUsername(){
      return $this->username;
   }

   function getPassword(){
      return $this->password;
   }
}
validata.php

<?php

class Validata{
   static function validataUser(User $user){
      //print_r($user);
	  $username = $user->getUsername();
	  $password = $user->getPassword();
	  //每次都要清空SESSION变量值
      unset($_SESSION['validata_username'],$_SESSION['validata_password']);
	  //验证用户名
	  try{
	    self::validataUsername($username);
	  } catch(MyException $me){
	    $_SESSION['validata_username'] = $me->getMessage();
	  }
	  //验证密码
	  try{
	    self::validataPassword($password);
      } catch(MyException $me){
	    $_SESSION['validata_password'] = $me->getMessage();
	  }
	  if(isset($me)){//对象存在时要抛出!
	    throw $me;
	  }
   }

   //验证用户名
   static private function validataUsername($username){
      $len = strlen($username);
	  if($len < 3){
	    //echo '用户名不能小于3位';
		//不能直接输出错误信息,而是抛出异常
		throw new MyException('用户名长度不能小于3位',E_USER_ERROR);
	  }
      if($len > 8){
	    throw new MyException('用户名长度不能大于8位',E_USER_ERROR);
	  }
   }
   //验证密码
   static private function validataPassword($password){
      $len = strlen($password);
	  if($len < 3){
	    //echo '用户名不能小于3位';
		//不能直接输出错误信息,而是抛出异常
		throw new MyException('密码长度不能小于3位',E_USER_ERROR);
	  }
      if($len > 8){
	    throw new MyException('密码长度不能大于8位',E_USER_ERROR);
	  }  
   }
}
MyException.php

<?php
class MyException extends Exception{

}
main.php

<?php

session_start();
echo '登录成功,登录用户为:'.$_SESSION['username'],'<br /><br />';
echo '<a href="index.php">重新登录</a>';







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值