相关疑难解决方法(0)

如何在PHP类型提示中捕获"可捕获的致命错误"?

我试图在我的一个类上实现PHP5的类型提示,

class ClassA {
    public function method_a (ClassB $b)
    {}
}

class ClassB {}
class ClassWrong{}
Run Code Online (Sandbox Code Playgroud)

正确用法:

$a = new ClassA;
$a->method_a(new ClassB);
Run Code Online (Sandbox Code Playgroud)

产生错误:

$a = new ClassA;
$a->method_a(new ClassWrong);
Run Code Online (Sandbox Code Playgroud)

可捕获的致命错误:传递给ClassA的参数1 :: method_a()必须是ClassB的一个实例,ClassWrong的实例给出...

我是否可以知道是否有可能发现错误(因为它说"可捕获")?如果是,怎么样?

谢谢.

php type-hinting fatal-error

94
推荐指数
1
解决办法
6万
查看次数

在PHP中安全地捕获"允许的内存大小耗尽"错误

我有一个网关脚本,它将JSON返回给客户端.在脚本中,我使用set_error_handler来捕获错误,并且仍然具有格式化的返回.

它受"允许的内存大小耗尽"错误的影响,但不是通过像ini_set('memory_limit','19T')之类的东西来增加内存限制,我只想返回用户应该尝试别的东西,因为它已经习惯了记忆.

有没有什么好方法可以捕获致命错误?

php memory

64
推荐指数
4
解决办法
3万
查看次数

如何捕获致命错误:PHP中超过30秒的最大执行时间

我一直在玩一个我正在开发的系统,并设法让它导致这个:

致命错误:超出最长执行时间30秒

它发生在我做一些不切实际的事情时,但它可能发生在用户身上.

有谁知道是否有办法捕捉这个例外?我已经读过了,但似乎每个人都建议增加允许的时间.

php try-catch fatal-error

54
推荐指数
5
解决办法
6万
查看次数

如何在遇到致命异常时让php返回500?

PHP致命错误作为状态代码200返回到HTTP客户端.如何让它返回状态码500(内部服务器错误)?

php error-handling error-code

50
推荐指数
5
解决办法
5万
查看次数

PHP尝试/捕获和致命错误

我使用以下脚本使用PHP使用数据库:

try{
    $db = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$db, $user, $pass, $options);
}
catch(Exception $e){
    $GLOBALS['errors'][] = $e;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想使用此数据库句柄使用此代码执行请求:

try{
    $query = $db->prepare("INSERT INTO users (...) VALUES (...);");
    $query->execute(array(
        '...' => $...,
        '...' => $...
    ));
}
catch(Exception $e){
    $GLOBALS['errors'][] = $e;
}
Run Code Online (Sandbox Code Playgroud)

这是问题所在:

  • 当与DB的连接正常时,一切正常,
  • 当连接失败但我不使用数据库时,我有$GLOBALS['errors'][]数组,之后脚本仍在运行,
  • 当与DB的连接失败时,我收到以下致命错误:

注意:未定义的变量:第32行的C:\ xampp\htdocs [...]\test.php中的db

致命错误:在第32行的C:\ xampp\htdocs [...]\test.php中调用非对象的成员函数prepare()

注意:第32行是$query = $db->prepare(...)指令.

也就是说,脚本崩溃了,try/catch似乎没用.你知道为什么第二次尝试/捕获不起作用以及如何解决它?

谢谢您的帮助!

编辑:有一些非常好的回复.我已经验证了一个不是我想要做的,但这可能是最好的方法.

php try-catch fatal-error

20
推荐指数
2
解决办法
4万
查看次数

try/catch在PHP中不起作用

为什么我收到此错误?

Warning: file_get_contents(http://www.example.com) [function.file-get-contents]: failed to open stream: HTTP request failed! in C:\xampp\htdocs\test.php on line 22

Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\test.php on line 22
Run Code Online (Sandbox Code Playgroud)

这是代码:

 try {
    $sgs = file_get_contents("http://www.example.com");
 }
 catch (Exception $e) {
    echo '123';
 }
 echo '467';
Run Code Online (Sandbox Code Playgroud)

是不是尝试\ catch应该继续执行代码?或者也许有一些不同的方式来做到这一点?

php try-catch

15
推荐指数
2
解决办法
2万
查看次数

如何通过电子邮件发送PHP致命错误?

我正在完善一大堆代码.很多它包含许多不影响代码执行的一般警告和注意事项(即:未定义的变量,或没有qoutes的数组键).

我想编写一个函数,让我首先专注于致命错误,然后我会打开不那么紧急的警告和通知.我找到了这个代码,但它通过电子邮件发送每个小警告通知和错误.

http://net.tutsplus.com/tutorials/php/quick-tip-email-error-logs-to-yourself-with-php/

如何修改此代码,使其仅处理以下内容:

  • 致命的语法错误
  • 未定义的功能
  • 无法包含文件

php syntax error-handling

15
推荐指数
3
解决办法
6595
查看次数

PHP try-catch块:它们能够捕获无效的arg类型吗?

背景:假设我有以下显然不正确的PHP:

    try{
        $vtest = '';
        print(array_pop($vtest));
    }catch(Exception $exx){}
Run Code Online (Sandbox Code Playgroud)

为了使用array_pop,$ vtest显然应该是一个数组,而不是一个字符串.然而,当我运行此代码时,会显示警告.我不希望这样,我只是希望代码无声地失败.

问题:与其他语言相比,PHP try-catch是否有一些特殊之处导致这种情况无效?

免责声明: 仅供参考,确实有其他方法可以在PHP中处理这种情况,但这些都是不可取的.这里的目标是避免:

"签名"技巧:

        $vtest = '';
        print(@array_pop($vtest)); // <-- would like to avoid this
Run Code Online (Sandbox Code Playgroud)

类型铸造:

        $vtest = '';
        $vtest = (array)$vtest;  
        print(array_pop($vtest));
Run Code Online (Sandbox Code Playgroud)

php arrays exception try-catch

14
推荐指数
2
解决办法
7412
查看次数

是否可以在PHP中防止"致命错误:调用未定义的函数"?

在PHP中,有什么方法可以忽略未定义的函数而不是抛出在浏览器中可见的致命错误?-ie,致命错误:调用未定义的函数

我知道有一种将所有自定义函数包装在条件中的做法,如下所示,但是有一种编程方式来获得这种效果吗?

if (function_exists('my_function')) { 

   // use my_function() here;

}
Run Code Online (Sandbox Code Playgroud)

php error-handling undefined fatal-error

12
推荐指数
2
解决办法
2万
查看次数

PHP单元测试:是否可以测试致命错误?

FWIW我正在使用SimpleTest 1.1alpha.

我有一个单例类,我想编写一个单元测试,通过尝试实例化类(它有一个私有构造函数)来保证该类是一个单例.

这显然会导致致命错误:

致命错误:调用私有FrontController :: __ construct()

有没有办法"捕获"致命错误并报告通过的测试?

php singleton unit-testing simpletest fatal-error

11
推荐指数
2
解决办法
6137
查看次数