一段代码了解 php 异常

<?php
/**
 * 异常捕获:try 手动抛出异常 try {} 代码块会停止运行, 但是后续代码会继续执行, 自动抛出异常try代码块依旧会执行
 * 错误捕获:可以通过 catch (Error $e) 捕获到错误
 * 如果是 fatal error,废话,什么语言碰到 fatal error 还能继续执行?
 * 异常捕获会向上冒泡,直到被捕获为止,并且会沿途执行所有的 finally 代码块
 * 如果一直没有被捕获, 则会产生 fatal error
 * catch 跟 throw 同时抛出同一种错误,则会捕获throw抛出的错误
 */
// 异常捕获:try 发生异常 try {} 代码块会停止运行, 但是后续代码会继续执行
// 如果是 fatal error,废话,什么语言碰到 fatal error 还能继续执行?
class MyException extends Exception
{
}
class ItException extends Exception
{
}
class HeException extends Exception
{
}
function inverse($x)
{
    if (!$x) {
        throw new MyException('Division by zero.');
    }
    return 1 / $x;
}
try {
    // inverse1(1); // fatal error 整个脚本会停止, 可以通过 catch Error捕获到错误
    // echo inverse(0) . "\n"; // warning级别 try {} 代码块会停止, 即不会输出 123
    echo 1/0; // 系统抛出异常,后续依旧会输出123, 如果是手动抛出异常,系统则不会输出 123.
    // throw new Exception('stop try');
    echo 123;
    echo inverse(5) . "\n";
} catch (Exception $e) {
    echo 'Caught exception1`: ',  $e->getMessage(), "\n";
}catch (Error $e) {
    echo 'Caught exception1`: ',  $e->getMessage(), "\n";
}
echo 1;
// 异常捕获会向上冒泡,直到被捕获为止,并且会沿途执行所有的 finally 代码块
try {
    try {
        // inverse1(1); // fatal error 整个脚本会停止
        echo inverse(0) . "\n"; // warning级别 try {} 代码块会停止
        echo inverse(5) . "\n";
    } catch (ItException $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }finally{
        echo "First finally.\n";
    }
} catch (MyException $e) {
    echo 'Caught MyException: ', $e->getMessage(), "\n";
}

// catch 跟 throw 同时抛出同一种错误,则会捕获throw抛出的错误

try {
    try {
        // inverse1(1); // fatal error 整个脚本会停止
        echo inverse(0) . "\n"; // warning级别 try {} 代码块会停止
        echo inverse(5) . "\n";
    } catch (MyException $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
        throw new MyException('catch MyException');
        echo "after throw\n";
    }finally{
        echo "First finally.\n";
        throw new MyException('finally MyException'); //如果存在则会使用finnaly 块的MyException
    }
} catch (MyException $e) {
    echo 'Caught MyException: ', $e->getMessage(), "\n";
}

// 异常捕获会向上冒泡,直到被捕获为止,并且会沿途执行所有的 finally 代码块
// 如果一直没有被捕获, 则会产生 fatal error
try {
    try {
        // inverse1(1); // fatal error 整个脚本会停止
        echo inverse(0) . "\n"; // warning级别 try {} 代码块会停止
        echo inverse(5) . "\n";
    } catch (ItException $e) {
        echo 'Caught exception: ',  $e->getMessage(), "\n";
    }
} catch (ItException $e) {
    echo 'Caught MyException: ', $e->getMessage(), "\n";
}
// 继续执行
echo "Hello World\n";
本作品采用《CC 协议》,转载必须注明作者和本文链接
reading
白小二
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 1
Junwind

大哥,格式稍微注意下啊

10个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!