PHP异常处理之抛出一个异常

从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被执行。

既然抛出异常会中断程序执行,那么为什么还需要使用异常处理?

异常抛出被用于在遇到未知错误,或者不符合预先设定的条件时,通知客户程序,以便进行其他相关处理,不至于使程序直接报错中断。

当代码中使用了try catch的时候,抛出的异常会在catch中捕获,否则会直接中断。

1、基本语法 try{ //可能出现错误或异常的代码 //catch表示捕获,Exception是php已定义好的异常类 } catch(Exception $e){ //对异常处理,方法: //1、自己处理 //2、不处理,将其再次抛出 }2、处理处理程序应当包括:Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。Throw - 这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象。

//创建可抛出一个异常的函数
function checkNum($number){
    if($number>1){
        throw new Exception("异常提示-数字必须小于等于1");
    }
    return true;
} //在 "try" 代码块中触发异常
try{
    checkNum(2);
    //如果异常被抛出,那么下面一行代码将不会被输出
    echo '如果能看到这个提示,说明你的数字小于等于1';
}catch(Exception $e){
    //捕获异常
    echo '捕获异常: ' .$e->getMessage();
}

上面代码将获得类似这样一个错误:

捕获异常:: 异常提示-数字必须小于等于1

例子解释:

上面的代码抛出了一个异常,并捕获了它:

创建 checkNum() 函数。它检测数字是否大于 1。如果是,则抛出一个异常。在 "try" 代码块中调用 checkNum() 函数。checkNum() 函数中的异常被抛出"catch" 代码块接收到该异常,并创建一个包含异常信息的对象 ($e)。通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息

PHP异常处理之异常处理类

PHP具有很多异常处理类,其中Exception是所有异常处理的基类。

Exception具有几个基本属性与方法,其中包括了:

message 异常消息内容code 异常代码file 抛出异常的文件名line 抛出异常在该文件的行数

其中常用的方法有:

getTrace 获取异常追踪信息getTraceAsString 获取异常追踪信息的字符串getMessage 获取出错信息

如果必要的话,可以通过继承Exception类来建立自定义的异常处理类。

//自定义的异常类,继承了PHP的异常基类Exception
class MyException extends Exception {
  function getInfo() {
      return '自定义错误信息';
  }
}

try {
  //使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
  throw new MyException('error');//这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
} catch(Exception $e) {//"catch" 代码块会捕获异常,并创建一个包含异常信息的对象
  echo $e->getInfo();//获取自定义的异常信息
  echo $e->getMessage();//获取继承自基类的getMessage信息
}

PHP异常处理之获取错误发生的所在行

在异常被捕获之后,我们可以通过异常处理对象获取其中的异常信息,前面我们已经了解捕获方式,以及获取基本的错误信息。

在实际应用中,我们通常会获取足够多的异常信息,然后写入到错误日志中。

通过我们需要将报错的文件名、行号、错误信息、异常追踪信息等记录到日志中,以便调试与修复问题。

<?php
try {
  throw new Exception('wrong');
} catch(Exception $ex) {
  $msg = 'Error:'.$ex->getMessage()."\n";
  $msg.= $ex->getTraceAsString()."\n";
  $msg.= '异常行号:'.$ex->getLine()."\n";
  $msg.= '所在文件:'.$ex->getFile()."\n";
  //将异常信息记录到日志中
PHP异常处理之   file_put_contents('error.log', $msg);
}

php学习----异常处理(接上篇)的更多相关文章

  1. WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]

    原文:WCF技术剖析之二十一: WCF基本的异常处理模式[上篇] 由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂.同时,WCF设计的一个目 ...

  2. Numpy学习笔记(上篇)

    目录 Numpy学习笔记(上篇) 一.Jupyter Notebook的基本使用 二.Jpuyter Notebook的魔法命令 1.%run 2.%timeit & %%timeit 3.% ...

  3. canvas学习笔记(上篇)-- canvas入门教程 -- canvas标签/方块/描边/路径/圆形/曲线

    [上篇] -- 建议学习时间4小时  课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...

  4. python学习-异常处理

    小技巧 isinstance(obj,foo) 检查是否obj是否是类 foo 的对象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) ...

  5. SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类

    Spring3.0 对异常的处理方式总共有两种: 一种是使用 HandlerExceptionResolver 接口,并且 Spring 已经提供默认的实现类 SimpleMappingExcepti ...

  6. python 学习 异常处理

    异常处理实例 while True: num1 = input('num1:') num2 = input('num2:') try: num1 = int(num1) num2 = int(num2 ...

  7. ThreadPoolExcutor 线程池 异常处理 (上篇)

    前言 最近看到crossoverJie的一篇文章:一个线程罢工的诡异事件 首先感谢原作者的分享,自己获益匪浅.然后是回想到自己的一次面试经历,面试官提问了线程池中的线程出现了异常该怎样捕获?会导致什么 ...

  8. java struts2入门学习---异常处理和类型转换

    一.struts2对异常的处理 1.自定义局部异常: <action> <exception-mapping result="sonException" exce ...

  9. Java学习---异常处理的学习

    基础知识 任何一门计算机程序设计语言都包括有绝对正确和相对正确的语句.绝对正确: 指任何情况下, 程序都会按照流程正确执行:相对正确: 程序的运行受到运行环境的制约, 在这种情况下, 需要附加检测和控 ...

随机推荐

  1. 【测试工程师面试】在BOSS直聘上和面试官的一问一答

    岗位描述: 信用卡核心系统功能测试,负责测试计划制定,测试设计,测试执行,测试进度掌控,自动化工具建设等工作.有责任心,执行力强,工作认真细致,逻辑思维强熟悉linux,oracle或者IBM大型机操 ...

  2. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  3. SpringBoot系列——EnableScheduling,对定时器的支持

    前言 定时器功能在项目里面往往会用到,比如定时发送邮件.定时释放数据库资源:这里记录一下springboot对定时器的支持的简单实例 cron表达式 开始之前要先介绍一下cron表达式,这里当一下百度 ...

  4. VUE组件汇总

    内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和 ...

  5. TensorFlow.js入门(一)一维向量的学习

    TensorFlow的介绍   TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着 ...

  6. 数据库部分(MySql)_4

    约束 约束:给表的字段名添加限制条件; 非空约束(not null):添加非空约束后,字段值不能为null: 唯一约束(unique):添加唯一约束后,字段值不能重复: 主键约束(primary ke ...

  7. petapoco 实体中字段去掉关联(类似于EF中的NotMap)

    怎么才能让不是数据库表中的字段放在实体中而不影响正常的插入和更新呢? 找到 PetaPoco.cs 文件,打开之后,搜索插入方法(Insert),然后继续找到下一层方法 就能看到如下代码: 看到这个注 ...

  8. .NET Core 实践二:事件通知和异步处理

    首先让我们来先看一个例子: 这是一个简单的用户下单购买商品的业务模型,输入端是用户,相关物料有订单和货物,相关的内部服务有业务(订单).财务(支付).仓储(备货)和物流(运输). 从图中我们可以看到, ...

  9. ASP.NET登录验证

    protected void btnLogin_Click(object sender, EventArgs e) { string username = txtUserName.Value.Trim ...

  10. JQuery官方学习资料(译):$ vs $()

    直到现在,我们一直是通过一个jQuery对象来调用函数的,例如: $( "h1" ).remove();      大多数jQuery函数是通过jQuery对象调用的,这是$.fn ...