php的异常处理,一个try代码块中抛出了多个异常,怎么全都捕获,并输出来?下面的代码为只输出一个异常?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php的异常处理,一个try代码块中抛出了多个异常,怎么全都捕获,并输出来?下面的代码为只输出一个异常?相关的知识,希望对你有一定的参考价值。

<?php
try
$error1="AAA";
$error2="BBB";
//php代码执行中产生的异常可以被throw语句抛出,并被catch 语句捕获。
throw new Exception($error1);//要进行异常处理的代码必须放在catch()语句块内
throw new Exception($error2);
echo "this will not be executed";
catch (Exception $f)
echo "Caught exception:".$f->getMessage();

?>
//只会输出Caught exception:AAA
//为什么BBB不会被捕获,并输出来呢?
//求解答,php异常处理,希望能详细点,谢谢大家

你还没有理解PHP中异常处理的机制,像你这种情况肯定只会输出一个异常的,不可能输出两个的,当你的 $error1 被抛出异常后,代码直接终止执行,所以下面的异常不会再抛出的,你当然只能获取到一个异常信息。 参考技术A 异常处理也不怎么用 我的理解就是 throw抛出的异常是对象 而 $f 是一个对象 无法返回2个异常对象本回答被提问者采纳

在 PHP Try Catch 块中抛出异常

【中文标题】在 PHP Try Catch 块中抛出异常【英文标题】:Throwing exceptions in a PHP Try Catch block 【发布时间】:2012-02-20 21:46:30 【问题描述】:

我在 Drupal 6 .module 文件中有一个 PHP 函数。我正在尝试在执行更密集的任务(例如数据库查询)之前运行初始变量验证。在 C# 中,我曾经在 Try 块的开头实现 IF 语句,如果验证失败,则会引发新的异常。抛出的异常将在 Catch 块中捕获。以下是我的 PHP 代码:

function _modulename_getData($field, $table) 
  try 
    if (empty($field)) 
      throw new Exception("The field is undefined."); 
    
    // rest of code here...
  
  catch (Exception $e) 
    throw $e->getMessage();
  

但是,当我尝试运行代码时,它告诉我只能在 Catch 块内抛出对象。

提前致谢!

【问题讨论】:

tl;dr "抛出 $e->getMessage();"应该是“throw $e;” 似乎产生了相同的代码:Parse error: syntax error, unexpected 'throw' (T_THROW)。我想不再支持了。 【参考方案1】:
function _modulename_getData($field, $table) 
  try 
    if (empty($field)) 
      throw new Exception("The field is undefined."); 
    
    // rest of code here...
  
  catch (Exception $e) 
    /*
        Here you can either echo the exception message like: 
        echo $e->getMessage(); 

        Or you can throw the Exception Object $e like:
        throw $e;
    */
  

【讨论】:

是的,您在 Catch 块中的两个建议都将解决我的问题。谢谢!【参考方案2】:

重新抛出做

 throw $e;

不是消息。

【讨论】:

谢谢,这个解决方案最适合我的需要。 我就是这么想的,很乐意提供帮助。 这会保留堆栈信息,还是会覆盖它? 保留,覆盖抛出一个新的电子【参考方案3】:

只需从 catch 块中删除 throw — 将其更改为 echo 或以其他方式处理错误。

不是告诉你对象只能在catch块中抛出,而是告诉你只有对象可以被抛出,错误的位置在catch块中——有一个区别。

在 catch 块中,你试图抛出你刚刚捕获的东西——在这种情况下无论如何这没什么意义——而你试图抛出的东西是一个字符串。

现实世界中你正在做的类比是接球,然后试图将制造商的标志扔到其他地方。您只能抛出整个对象,而不是对象的属性。

【讨论】:

感谢您的澄清。 很好的比喻(y)。【参考方案4】:

你试图抛出一个string

throw $e->getMessage();

您只能抛出实现\Throwable 的对象,例如\Exception.

附带说明:异常通常用于定义应用程序的异常状态,而不是用于验证后的错误消息。当用户向您提供无效数据时也不例外

【讨论】:

处理验证的更好方法是什么? IF 语句是否更适合处理无效的用户数据? 简而言之:是的。长篇大论:将无效参数的出现视为您的应用程序中可能发生的任何其他情况,并显示其他有用的(错误)页面。 function validateField($validate) return empty($validate); 和某处例如 if validateField($x) echo "Field is empty";elsedoSomethingUseful(); @lazycommit "invalid data" 有点笼统。如果您的意思是“用户给出的无效值”,那么从应用程序的角度来看,它们并不是无效的,因为应用程序必须期望这一点,因此必须适当地对待它们(--> 验证)。如果您稍后在处理过程中传递无效数据(来自后端,或者因为您没有正确验证),那么是:异常。总结一下:不要将Exceptions 用于控制流(这里:验证):) 你只能throw对象,所以throw $e;throw new \Exception( $e-&gt;getMessage() );【参考方案5】:

Throw 需要一个由\Exception 实例化的对象。只需抓住$e 就可以发挥作用。

throw $e

【讨论】:

以上是关于php的异常处理,一个try代码块中抛出了多个异常,怎么全都捕获,并输出来?下面的代码为只输出一个异常?的主要内容,如果未能解决你的问题,请参考以下文章

在PHP Try Catch块中抛出异常

JAVA语言如何进行异常处理,关键字throws,throw,try,catch,finally分别代表啥意义在try块中抛出异常吗

在 try 块中抛出异常后,catch 块不会立即执行

在 finally 块中抛出异常

在线程中处理在 catch 块中抛出的异常的最佳实践。 (。网)

finally中流关闭失败需要抛出异常吗