将错误转换为异常:设计缺陷?

2023-11-24

我最近遇到一些代码,它们使用自定义错误处理程序将任何 PHP 错误转换为通用应用程序异常。还定义了一个自定义异常处理程序,如果异常在特定错误代码范围内,它将记录异常。例子:

class AppException extends Exception
{

}

function error_handler($errno, $errstr, $errfile, $errline)
{
    throw new AppException($errstr, $errno);
}

function exception_handler($exception)
{
    $min = ...;
    $max = ...;

    if ($exception->getCode() >= $min && $exception->getCode() <= $max)
    {
        // log exception
    }
}

set_error_handler('error_handler');
set_exception_handler('exception_handler');

$a[1]; // throws exception

问题是我看到了这样的事情:

try
{
    do_something();
}
catch (AppException $exception)
{
}

这意味着实际的编程错误和“异常”行为之间没有区别。经过进一步挖掘,我发现了部分代码是围绕 PHP 错误代表“异常”行为的想法设计的,例如:

...

function my_function($param1, $param2)
{
    // do something great
}

try
{
    my_function('only_one_param');
}
catch (AppException $exception)
{
}

这最终会混淆错误和应用程序界面的设计。

您对以这种方式处理错误有何看法?是否值得将 PHP 的本机错误转为异常?在上述情况下,如果代码库是围绕这个想法设计的,您会怎么做?


就我个人而言,我一直这样做。唯一的区别是在我的error_handler函数,我检查错误是否是E_NOTICE首先,只有在不是的情况下才会抛出(无论如何我都会记录通知)......

我会改变AppException延伸到某事物ErrorException... 就像是:PhpRuntimeErrorException extends ErrorException仅用于 PHP 错误...原因是这样它更具可读性(更容易分辨什么是PhpRuntimeErrorException不需要弄清楚它被扔到哪里)。另一个原因是,ErrorException将存储生成的行/文件/等信息,它不会存储在其他地方(因为回溯从throw线)...

因此,您可以“尝试”这样的代码:

try {
    $f = fopen('foo.bar', 'r');
    $ret = '';
    while ($data = fread($f)) {
        $ret .= process($data);
    }
    fclose($f);
    return '';
} catch (PHPRuntimeErrorException $e) {
    throw new RuntimeException('Could not open file');
} catch (ProcessException $e) {
    fclose($f);
    throw new RuntimeException('Could not process data');
}
return $ret;

我还让我的默认异常处理程序生成 500 服务器错误页面。那是因为任何异常都应该被捕获,如果没有,那确实是服务器错误......

只是我的经验和看法...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将错误转换为异常:设计缺陷? 的相关文章

随机推荐

  • 减少内存流失的方法

    背景 我有一个 Spring 批处理程序 它读取一个文件 我正在使用的示例文件大小约为 4 GB 对文件进行少量处理 然后将其写到 Oracle 数据库中 我的程序使用 1 个线程来读取文件 并使用 12 个工作线程来进行处理和数据库推送
  • 绘制图像最简单的方法?

    假设您要从硬盘读取通用文件格式的图像文件 更改一个像素的颜色 并将生成的图像显示到屏幕上 使用 C 语言 您会推荐哪些 开源 库来用最少的代码完成上述任务 或者 哪些库会以最优雅的方式执行上述操作 一些背景知识 我最近阅读了大量计算机图形文
  • 如何使用 Bash 循环日期?

    我有这样的 bash 脚本 array 2015 01 01 2015 01 02 for i in array do python home user executeJobs py i gt home user i log done 现在
  • 如何根据动态字段名引用 Linq 中的字段

    首先 对这个糟糕的问题标题表示歉意 不完全确定我问的问题是否正确 通常我可以执行以下操作来访问字段 MyTables table dc MyTables SingleOrDefault p gt p id someId somevalue
  • 在哪里放置前端 javascript 配置变量

    我有一个 Javascript 前端 可以对我的后端进行 Ajax 调用 为此 它需要一个我在 Ajax get 调用中硬编码的 backend URL 例如 http myservice 后端 现在 如果我想在不同的机器上部署我的应用程序
  • 如何检测GPS信号强还是弱?

    如何检测GPS信号强度 如低 弱 或高 有API类吗 提前致谢 GpsStatus getSatellites for each of those do GpsSatelite getSnr that ruturns the signal
  • Ruby on Rails:搜索表单 - 多个搜索字段

    我正在尝试创建一个允许用户搜索数据库的应用程序 搜索页面布局将使用一些下拉菜单来显示数据库中已有的数据以缩小搜索范围 并且还使用文本框来允许用户输入 项目名称 等关键字 我在让 Rails 获取搜索表单中输入的所有信息并执行一项大型搜索时遇
  • 如何从 Python 列表中的字符串中删除前导和尾随空格

    我有一个清单 row hi there how some stuff is here are you 如你看到的row 8 some stuff is here are 如果最后一个字符是空格 我想得到除了最后一个字符之外的所有内容 如下所
  • 我可以编写一个具有条件表选择的查询吗

    我们有 2 个具有相同结构的表 并且基于一个变量 我想选择要选择的表 而不必在我的过程中编写 2 个查询 这可能吗 I tried declare table int set table 1 Select orderID Quantity
  • 为什么 querySelector 仅选择第一个元素以及如何解决此问题?

    我正在尝试制作一个日历 当我单击其中一个日期时 会弹出一个您必须填写的表格 我无法使其正常工作 我唯一能上班的是第一个 1 约会 其他一切都不起作用 我不知道如何解决它 我尝试重写代码并切换到 id 但没有任何效果 任何帮助表示赞赏 谢谢
  • 如何在 Eclipse 中附加 Android 支持库源代码?

    将源代码附加到外部库真是太棒了 在哪里可以找到 v4 的源代码支持包 最好是一个 zip 文件 可以轻松附加到android support v4 jar在 Eclipse 中 我只是想添加另一种附加支持库源的方法 需要20或更高版本的AD
  • 我可以调试从 IPA 存档安装的 iOS 应用程序吗?

    我的应用程序遇到一些问题 仅当我临时安装它时才会重现 但如果我只是从 Xcode 运行该应用程序则不会重现 我想调试这个问题 但到目前为止我还没有任何运气 我正在使用 Xcode 5 1 1 这是我所做的 1 转到产品 gt 方案 gt 编
  • HTML5/JS/jQuery:输入无效时,将不同的(任意)元素标记为无效

    我正在尝试创建一个标准的新密码表单 您可以在其中输入一次新密码 然后再次输入以进行确认 我希望一旦你模糊这些字段 如果它们不匹配 both将被标记为无效 如以下情况 用户输入密码abc into newpassword1 用户选项卡 new
  • 编写重试逻辑的最简洁方法?

    有时我需要在放弃之前重试某个操作几次 我的代码是这样的 int retries 3 while true try DoSomething break success catch if retries 0 throw else Thread
  • 有 Spring Boot 与 cucumber-jvm 配合使用吗?

    我正在使用 Spring Boot 因为它删除了所有无聊的东西 让我专注于我的代码 但所有测试示例都使用 junit 而我想使用 Cucumber 有人能给我指出正确的方向 让黄瓜和弹簧启动 进行所有自动配置和接线 并让我的步骤定义使用自动
  • IntelliJ 和 WAR....更改的文件不会被服务器自动识别

    我正在使用 Tomcat 运行 Intellij Ultimate 并部署战争 一切都很好地部署到 tomcat 的 webapp 目录 当我更改 xhtml 文件等文件时 tomcat 有没有办法自动获取该更改 截至目前 我需要从 Int
  • 通过 JavaMail API 发送邮件时无法连接到 SMTP 主机异常

    我正在尝试使用 JavaMail API 向 Gmail 帐户发送电子邮件 我已经完成了以下代码 我想将邮件发送给多个收件人 但它不起作用 它给出了一个异常 例如 无法连接到 SMTP 主机 发送失败 package com cts ema
  • 在 Hamcrest 中进行测试,列表中仅存在一项具有特定属性的项目

    使用 Hamcrest 我们可以轻松测试是否存在最后一个列表中具有特定属性的项目 例如 List
  • 为什么 std::atomic 的compare_exchange 采用期望值的引用?

    原因是什么std atomic
  • 将错误转换为异常:设计缺陷?

    我最近遇到一些代码 它们使用自定义错误处理程序将任何 PHP 错误转换为通用应用程序异常 还定义了一个自定义异常处理程序 如果异常在特定错误代码范围内 它将记录异常 例子 class AppException extends Excepti