专栏首页城边编程编程中的异常处理机制

编程中的异常处理机制

城边编程 phplog

读完需要

6

分钟

速读仅需3分钟

有人问我对于华为HR胡玲的事情怎么看?

在马克思主义政治经济学中,剥削指的是生产者(无产者)为所有者(资本家)以低于实际补偿的价格进行工作。无产者被迫出售自己的劳动,而不是一定量的劳动,以获得工资,维持生计。资本家则剥削无产者的成果,聚敛剩余价值。因此,资本家通过拥有生产资料来获利,而劳工则被剥夺了成果的所有权。

正文

异常处理又称为错误处理,用来解决程序运行时出现的意外或异常情况。异常处理一般有两种模型,终止模型和恢复模型。

『终止模型』指在程序运行时只要异常被抛出就已无法挽回,程序将终止运行。『恢复模型』指程序运行出错之后能提供修正的方法,让程序继续执行。任何编程语言都是基于这两种模型处理异常。

恢复模型可以理解为常用的`try catch`,终止模型可以理解为项目中无法支配的神秘力量。所以不要认为程序员就能掌控程序,大多时候他们连异常都掌控不了。

终止模型会导致服务中断,没有重来的机会,解决办法是对日志做监控及时的叫醒程序员起床修复。恢复模型会给程序一次重来的机会,在面向对象的语言中实现方法大同小异,如下:

try{
    // 可能抛出异常的语句
}catch(exceptionType variable){
    // 处理异常的语句
}

try是“检测”的意思,用来检测语句块有没有异常,catch 是“抓住”的意思,用来捕获并处理 try 检测到的异常。如果 try 语句块没有检测到异常,那么就不会执行 catch 中的语句。说的有点拗口,简单点说:

try是法律,catch是警察。要是在法律的规定下违法了,警察会抓人(如果违反了交规,就需要交警去抓,catch的参数也很重要)。如果遵纪守法,警察就不会出现。

接下来看看JAVA和PHP的异常处理机制。

Java异常处理机制

Java的异常处理机制非常完善,是行业五星项目,无论你喜不喜欢都要学习他的异常处理。因为Java需要将代码编译成二进制码,所以Java的异常类型也分为两种,Checked Exception 和 Unchecked Exception。

Checked Exception指编译时检查是否加了异常判断,比如写了IO操作但没有检测IO异常(IOException)会提示编译错误。自定义的Exception都应该是Checked Exception,以便于最大化利用Java编译器的编译时检查。

Unchecked Exception指编译时不检查的异常,Unchecked Exception又分为可捕获的异常和无法捕获的异常。比如空指针异常(NullPointerException)就是可捕获的异常。Error就是无法捕获的异常,会导致程序终止。如下图

作为行业标杆,Java的异常处理机制远不止这些,这里不展开讲。感兴趣的朋友可以Google。

PHP的异常处理

相比Java,PHP的异常处理就有些山寨,早期的PHP不支持面向对象编程,到PHP5才引入了面向对象的相关语法。所以异常处理是PHP的错误处理系统向面向对象演进后的产物。

Java在编译时会检测Checked Exception,不处理编译无法通过。PHP少了编译的步骤,所以无法原生的实现对异常的检测。好在我们可以通过第三方工具去检测异常的处理,比如利用编辑器的提示功能,在gitlab中集成代码检测功能等。虽然是曲线救国,但也算朝着标准在努力。

我曾经看到有开发人员直接给入口函数加`try catch`,将整个请求都包裹起来就是非常糟糕的做法,这样做不但会影响程序的性能还会将一些应该暴露的问题隐藏。

很多开发者不清楚什么时候该用`try catch`。按正常的开发规范,应该检查调用的函数是否会抛出异常(主流的编辑器都有提示功能),然后进行相应的处理,尤其是使用第三方编写的PHP组件和框架时。比如调用PHP的`file_get_contents`函数时就可能返回异常,所以使用`file_get_contents`要加`try catch`。

PHP异常处理相关配置

PHP提供了灵活的异常处理配置,很方便进行开发调试,对生产环境的未知错误做预警等。

;显示错误
display_startup_errors = On
display_errors = On

;报告所有错误
error_reporting = -1

;记录错误
log_errors = On
在生产环境中设置 php.ini 文件的错误报告方式如下:

;不显示错误
display_startup_errors = Off
display_errors = Off

;除了notice级别错误外,报告所有其他错误
error_reporting = E_ALL & ~E_NOTICE

;记录错误
log_errors = On
如果生产环境有缺陷,我们一般通过查看 PHP 错误日志来定位问题。

推荐一个PHP的错误展示包,可通过composer直接安装。

//使用文档可直接查看扩展包的readme文件
composer require filp/whoops --dev

最后

本文分享自微信公众号 - 城边编程(code-log)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试官,Java8 JVM内存结构变了,永久代到元空间

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1161110
  • 每个阿里程序员都必须搞懂的Maven基础知识

    以前我们写代码时,jar包都默认放在一个叫 /lib 的目录下,然后把该目录设置为classpath可以读取到的目录,如下图所示:

    老钱
  • 【Python 第75课】可迭代对象和迭代器

    for 循环是我们在 Python 里非常常用的一个语法,但你有没有思考过 for 循环是怎样实现的?

    Crossin先生
  • 常问的15个顶级Java多线程面试题

    在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得更多职位,那么你应该准备很多关于多线程的问题。

    搜云库技术团队
  • 帮你少写一大半参数校验代码的小技巧

    几乎每个web网站都会对用户提交的参数进行校验,前端要做,后端也要做。防止用户直接通过接口调用的方式来请求或保存数据,从而导致产生脏数据等其他严重的后果。

    Java识堂
  • Java日志Log4j或者Logback的NDC和MDC功能

    Java中使用的日志的实现框架有很多种,常用的log4j和logback以及java.util.logging,而log4j是apache实现的一个开源日志组件...

    JAVA日知录
  • 一个 Java 对象到底有多大?

    编写Java代码的时候,大多数情况下,我们很少关注一个Java对象究竟有多大(占据多少内存),更多的是关注业务与逻辑。但是殊不知,在我们不经意间,大量的内存被无...

    芋道源码
  • Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)

    测试方法是可以带有参数的。每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数。

    北京-宏哥
  • 面试再问ThreadLocal,别说你不会

    以前面试的时候问到ThreadLocal总是一脸懵逼,只知道有这个哥们,不了解他是用来做什么的,更不清楚他的原理了。表面上看他是和多线程,线程同步有关的一个工具...

    业余草
  • 慌了!面试官又拿JVM开怼!

    对于Java人来说,JVM无疑是进阶时必须迈过的坎。不管初入职场还是跳槽升职,JVM更是面试时的必考题。如果不懂JVM的话,薪酬会非常吃亏(近70%的面试者挂在...

    Java3y

扫码关注云+社区

领取腾讯云代金券