鸿蒙 ArkTS 实战:登录 + 注册 + 主页页面跳转完整教程第一步:配置页面路由(main_pages.json)打开 entry/src/main/resources/base/profil
2026/6/30 16:30:17
| 错误码 | 含义 | 可捕获性 |
|---|---|---|
| E_ERROR | 致命运行时错误 | 否(终止脚本) |
| E_WARNING | 运行时警告(非致命) | 是 |
| E_DEPRECATED | 使用了不推荐的特性 | 是 |
// 示例:捕获类型错误 try { function add(int $a, int $b) { return $a + $b; } add("five", "three"); // 触发 TypeError } catch (TypeError $e) { echo "类型错误: " . $e->getMessage(); // 输出错误信息 } // 执行逻辑:函数期望整型参数,传入字符串将抛出异常并被捕获function &getRef() { return $undefinedVar; // 致命错误:试图返回未定义变量的引用 }上述代码在运行时抛出E_ERROR,因为 PHP 不允许返回未初始化变量的引用。此类错误无法被异常处理机制捕获,且不触发析构函数。2 { echo "Too many elements"; }上述代码将触发 E_PARSE 错误。第一行中方括号未正确闭合,第二行条件表达式缺少右圆括号。PHP解析器无法生成有效的操作码,导致编译中断。php -c /path/to/php.ini -v该命令用于验证 PHP 配置文件加载过程。若出现 E_CORE_ERROR,将立即终止并输出错误信息。参数说明: --c:指定自定义配置文件路径; --v:显示 PHP 版本及启动时的模块加载信息,有助于定位初始化失败点。E_COMPILE_ERROR是PHP在编译阶段由Zend引擎触发的严重错误,一旦发生即终止脚本编译。这类错误通常源于语法结构缺失或扩展函数调用异常,例如在使用eval()时传入非法代码。
eval('function test() { if (true) { echo "hello"; }'); // 缺少闭合大括号将导致 E_COMPILE_ERROR上述代码因缺少函数闭合括号,在编译阶段被Zend引擎拒绝,输出致命错误。开发者应确保动态代码语法完整,并借助php -l进行静态语法检查。
E_USER_ERROR是一种由开发者主动触发的用户级致命错误,用于标识不可恢复的逻辑异常。它通过trigger_error()函数抛出,并中断脚本执行,是实现防御性编程的重要手段。function divide($a, $b) { if ($b == 0) { trigger_error("除数不能为零", E_USER_ERROR); } return $a / $b; }上述代码在检测到非法参数时主动抛出致命错误,防止后续逻辑崩溃。相比异常,E_USER_ERROR更适用于终止不可继续的流程。| 错误类型 | 可捕获 | 是否终止脚本 |
|---|---|---|
| E_USER_WARNING | 是 | 否 |
| E_USER_NOTICE | 是 | 否 |
| E_USER_ERROR | 否 | 是 |
E_WARNING是 PHP 在运行过程中遇到非致命错误时触发的错误级别,程序仍会继续执行。典型场景包括包含不存在的文件、向函数传递不兼容的参数类型等。include 'nonexistent_file.php'; // 触发 E_WARNING该语句尝试包含一个不存在的文件,PHP 会生成一条警告日志,但脚本不会终止,适用于容错性较高的系统设计。E_WARNING记录至应用日志:error_log()写入系统或自定义日志文件| 错误类型 | 是否中断执行 | 建议处理方式 |
|---|---|---|
| E_WARNING | 否 | 记录日志并监控频率 |
E_NOTICE错误,典型表现为“Undefined variable”或“Undefined index”。这类问题虽不中断执行,却暴露了代码健壮性缺陷。error_reporting(E_ALL); ini_set('display_errors', 1);该配置强制输出所有警告,包括未定义变量和数组索引访问,便于早期修复。isset()检查变量是否存在??空合并操作符设置默认值$username = $_POST['username'] ?? 'guest';避免直接访问可能不存在的超全局数组键名,有效抑制E_NOTICE。declare(strict_types=1); function add(int $a, int $b): int { return $a + $b; }参数和返回值类型强制校验,降低因类型混淆导致的逻辑偏差。E_DEPRECATED,用于提示开发者其将在未来版本中移除。及时识别并替换这些函数是保障应用长期可维护的关键。mysql_connect()→ 使用mysqli或PDOcreate_function()→ 替换为匿名函数(Closure)each()→ 改用foreach遍历数组// 旧写法(触发 E_DEPRECATED) $callback = create_function('$a', 'return $a * 2;'); // 新写法(推荐) $callback = function($a) { return $a * 2; };上述代码中,create_function()因存在性能与安全问题被弃用,使用闭包不仅提升执行效率,还支持变量绑定,增强代码可读性。
error_reporting(E_ALL); ini_set('display_errors', 1);interface CustomProblem extends Throwable { public function getSeverity(): int; }上述代码在 PHP 8.6 中将被拒绝执行,因 `Throwable` 不支持直接实现,必须通过继承 `Exception` 或其子类完成扩展。function errorToException($severity, $message, $file, $line) { if (!(error_reporting() & $severity)) { return; } throw new ErrorException($message, 0, $severity, $file, $line); } set_error_handler('errorToException');该函数捕获非致命错误,将其封装为ErrorException抛出。参数说明: -$severity:错误级别; -$message:错误信息; -$file和$line:定位错误位置; - 判断error_reporting()可避免处理被抑制的错误。if err != nil { return fmt.Errorf("failed to process user %s: %w", userID, err) }此处使用%w动词包装错误,保留了底层错误引用,便于后续使用errors.Unwrap()追溯。@会临时关闭错误报告,导致引擎在运行时额外启用错误捕获机制。这不仅掩盖了潜在问题,还带来性能损耗。$value = @$config['key'] ?? 'default';上述代码使用@抑制数组键不存在的Notice,但每次执行都会触发错误处理器的开关流程。@比显式检查慢约 1.5~2 倍。推荐使用语言结构进行安全判断:isset():检测变量是否存在array_key_exists():检查数组键??:提供默认值$value = $config['key'] ?? 'default'; // 推荐写法该方式语义清晰、性能更优,且不干扰错误调试流程。try { $result = $database->query("SELECT * FROM users WHERE id = ?", [$userId]); } catch (PDOException $e) { error_log("Database query failed: " . $e->getMessage()); throw new RuntimeException("Unable to retrieve user data", 0, $e); }| 检查项 | 验证方式 | 超时阈值 |
|---|---|---|
| 数据库连接 | PDO ping或简单查询 | 2秒 |
| Redis服务 | PING命令响应 | 1秒 |
| 存储空间 | disk_free_space() | 即时 |