升级到PHP 7后,出现CodeIgniter CI_Exceptions::show_exception错误

7

我曾经使用PHP 5.6和CodeIgniter 3.0.0。

昨天我升级到了PHP 7,然后出现了以下错误:

Uncaught TypeError: Argument 1 passed to CI_Exceptions::show_exception() must be
 an instance of Exception, instance of Error given, called in /my/file/path/app/system/core/Common.php on line 658 and defined in /my/file/path/hgx_portal/app/system/core/Exceptions.php:190
Stack trace:
#0 /my/file/path/hgx_portal/app/system/core/Common.php(658): CI_Exceptions->show_exception(Object
(Error))
#1 [internal function]: _exception_handler(Object(Error))
#2 {main}
  thrown in /my/file/path/hgx_portal/app/system/core/Exceptions.phpon line 190

1
升级到Codeigniter 3.06。如果您仍然遇到错误,请在codeigniter.com论坛上发布。 - cartalot
实际上,我无法升级到CI 3.06版本。我觉得我需要回滚到PHP 5.6版本。 - Jatin Dhoot
1
CI 3.0已经超过一年了,所以当您有能力时,请升级。 - cartalot
好的,谢谢您的建议。我会这样做。 - Jatin Dhoot
3个回答

13

CodeIgniter 3.0.0存在一个已知问题,详见github问题链接以及下面的更新日志

修复了一个bug(#4137) - :doc:Error Handling <general/errors> 在PHP 7下对新的错误异常无法正常处理。

这是因为在PHP 7中,set_exception_handler() 改变了行为

使用类型声明Exception注册到set_exception_handler()的异常处理器会在抛出Error对象时导致致命错误。

如果处理器需要同时在PHP 5和7上运行,应该从处理器中删除类型声明,而迁移到PHP 7的代码则可以将Exception类型声明简单替换为Throwable。

<?php
// PHP 5 era code that will break.
function handler(Exception $e) { ... }
set_exception_handler('handler');

// PHP 5 and 7 compatible.
function handler($e) { ... }

// PHP 7 only.
function handler(Throwable $e) { ... }
?>
升级到3.0.2以上的任何版本都将解决您的问题。

你为什么要链接到已经关闭的问题? - cartalot
1
抱歉,我本应指出该问题只在3.0.2版本中被修复,而上面的问题明确说明他们正在使用3.0.0版本。 - Garry Welding
1
而且一个小细节是,CI 3.00发布的时间比第一个PHP 7 alpha版本早了几个月。 - cartalot

10

这个错误是由PHP 7引起的(在set_exception_handler函数中抛出Error而不是Exception

如果您无法升级CodeIgniter系统文件夹,您可以更改文件system/core/Exceptions.php的第190行:

public function show_exception(Exception $exception)

为了

public function show_exception($exception)

-1
只需进入 /system/core/Exceptions.php 文件,然后“保存”即可。
对我有效。
我使用 macOS Monterey、PHP 8.1.2。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接