• PHP面向对象之异常处理


    异常处理

    • 概念

      • 集中处理在代码块中发生的异常
      • 在代码块中发生了异常直接抛出,代码块中不处理异常,将异常集中起来一起处理
    • 使用的关键字

      • try 监测代码块
      • catch 捕获异常
      • throw 抛出异常,抛出异常后,try块终止执行,执行权限交给catch块
      • finally 无论有无异常都会执行,可以省略
      • Exception 异常类
    • 语法结构

    try{
    	//检测代码
    }catch(Exception $ex){
    	//捕获异常
    }
    finally{
    	//不论是否有异常,都要执行,finally可以省略
    }
    
    <?php
    header("Content-Type: text/html; charset=utf-8");
    if($_SERVER['REQUEST_METHOD']== 'POST'){
    	if(isset($_POST['button'])) {
    		try{
    			$age=$_POST['age'];
    			if($age=='')
    				throw new Exception('年龄不能为空',1001);	//抛出异常
    			if(!is_numeric($age))
    				throw new Exception('年龄必须是数字',1001);	//抛出异常
    			if(!($age>=10 && $age<=30)) 
    				throw new Exception('年龄必须在10-30之间',1002);	//抛出异常
    			echo '您的年龄合适<br>';
    		}catch(Exception $ex){		//捕获异常
    			echo '错误信息:'.$ex->getMessage(),'<br>';
    			echo '错误码:'.$ex->getCode(),'<br>';
    			echo '文件地址:'.$ex->getFile(),'<br>';
    			echo '错误行号:'.$ex->getLine(),'<br>';
    		}
    		finally{
    			echo '关闭数据库连接';  //不管是否有异常,finally都要执行
    			exit;
    		}
    	}
    }
    ?>
    <form method="post" action="">
    	年龄: <input type="text" name="age"> <br />
    	<input type="submit" name="button" value="提交">
    </form>
    

    自定义异常

    • 场景:如果实现异常的分类处理
      • 比如异常有三个级别,异常对应三种处理方式
      • 自定义三种异常即可
      • 所有异常类的父类是Exception,Exception中的方法不允许重写
    <?php
    //自定义空异常类
    class MyNullException extends Exception {
    }
    //自定义类型异常
    class MyTypeException extends Exception {
    }
    //自定义范围异常
    class MyRangeException extends Exception {
    }
    //逻辑代码
    header("Content-Type: text/html; charset=utf-8");
    if($_SERVER['REQUEST_METHOD']== 'POST'){
    	if(isset($_POST['button'])) {
    		try{
    			$name= $_POST['name'];
    			$age= $_POST['age'];
    			if($name=='')
    				throw new MyNullException('姓名不能为空');
    			if($age=='')
    				throw new MyNullException('年龄不能为空');
    			if(!is_numeric($age))
    				throw new MyTypeException('年龄不是数字');
    			if($age<10 || $age>30)
    				throw new MyRangeException('年龄必须在10-30之间');
    			echo '姓名:'.$name,'<br>';
    			echo '年龄:'.$age;
    		}catch(MyNullException $ex){
    			echo $ex->getMessage(),'<br>';
    			echo '错误记录在日志中';
    		}catch(MyTypeException $ex){
    			echo $ex->getMessage(),'<br>';
    			echo '发送电子邮件';
    		}catch(MyRangeException $ex){
    			echo $ex->getMessage(),'<br>';
    			echo '给管理员打电话';
    		}
    	}
    	exit;
    }
    ?>
    <form method="post" action="">
    	姓名: <input type="text" name="name"> <br />
    	年龄: <input type="text" name="age"> <br />
    	<input type="submit" name="button" value="提交">
    </form>
    
  • 相关阅读:
    vue 设置全局变量、指定请求的 baseurl
    npm ERR! missing script: build
    npm install 报错,提示`gyp ERR! stack Error: EACCES: permission denied` 解决方法
    vue-cli 4 安装与 新建项目 路由
    PHP7安装redis扩展
    C#中的list的System.Predicate<in T>和System.Comparison<in T>的应用
    6个2教你认识递归的力量!
    C#中的预编译指令介绍[转]
    C#---数据库访问通用类、Access数据库操作类、mysql类 .[转]
    GOTO语句以及GOTO机制的模式实现
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14117143.html
Copyright © 2020-2023  润新知