【问题标题】:Handling Exceptions - Fatal error: Uncaught exception 'EppCommandsExceptions' with message 'Command syntax error'处理异常 - 致命错误:未捕获的异常“EppCommandsExceptions”和消息“命令语法错误”
【发布时间】:2010-07-29 15:19:43
【问题描述】:

致命错误:未捕获的异常 带有消息的“EppCommandsExceptions” '必需的参数丢失'

有问题的行:

throw new EppCommandsExceptions($result->msg, $codigo); 

为什么我在这一行出现这个错误?

关于EppCommandsExceptions.class.php 我有这个扩展异常的类:

class EppCommandsExceptions extends Exception
{
    //could be empty.
}

接下来,在 CommandsController.php 我有:

include_once('EppCommandsExceptions.class.php');

然后,如果 method1 发生了不好的事情:

throw new EppCommandsExceptions($result->msg, $codigo);

稍后,在同一个控制器上,另一个 method2 将在 method1 之后运行, 我有: 如果这也有问题:

throw new EppCommandsExceptions($result->msg, $codigo);

稍后我有,对于联系部分 - method1

try
{
    $createdContact = $comandos->createContact($contactoVo);
}
catch(EppCommandsExceptions $e)
{
    $error .= 'Error Contact. Cód:'.$e->getCode().' Mensagem:'.$e->getMessage();
}

然后,对于域部分:method2

try
{
    $createdDomain = $comandos->createDomain($domainVo);
}
catch(EppCommandsExceptions $e)
{
    $error .= 'Error Domain. Cód:'.$e->getCode().' Mensagem:'.$e->getMessage();
}

是因为我对这两种方法都使用了相同的异常吗? 我应该为每个方法设置一个异常类吗? :s

请指教, 非常感谢。 内存

【问题讨论】:

    标签: php exception try-catch


    【解决方案1】:

    您抛出的异常只有在 try 块内时才会被捕获。

    如果不是,它将向上传播调用堆栈,直到它被早期的调用函数之一捕获。

    您收到致命错误是因为您抛出的异常从未被捕获,因此它由默认的未处理异常处理程序处理,该处理程序会发出致命错误。

    例子:

    try
    {
        $createdContact = $comandos->createContact($contactoVo);
        if (error_condition())
            throw new EppCommandsExceptions $e;
    }
    catch(EppCommandsExceptions $e)
    {
        $error .= 'Error Contact. Cód:'.$e->getCode().' Mensagem:'.$e->getMessage();
    }
    

    直接在 try 块中抛出异常通常不是很有用,因为您可以直接从错误条件中恢复而不是抛出异常。但是,如果createContact 可能会引发异常,则此构造会变得更加有用。在这种情况下,您必须在某个时候捕获 EppCommandsExceptions 以避免致命错误。

    【讨论】:

    • 我还没有完全理解你的回答。所以这可能是因为我还没有完全理解。所以:“你抛出的异常只有在 try 块内才会被捕获。”如果我在 method2 上注释包含 throw 的行,此异常将起作用。有效的方法 1 的抛出不是在 try catch 内,而是在条件内(在 else 部分)。因此,当在 try 块外调用时,此异常似乎有效。 :s ?
    • @MEM 这只是意味着method2中抛出的异常永远不会被捕获,而method1中抛出的异常是在method1本身或上游。
    • 知道了。我不明白你所说的“向上调用堆栈”是什么意思我的无知。Np 现在。需要解决这个问题:“直接在try块中抛出异常通常不是很有用,因为你可以直接从错误条件中恢复而不是抛出异常。”是的。这就是我不这样做的原因。 “不过,如果 createContact 可能抛出异常,这个构造就会变得更加有用。”但是 createContact 正在引发异常。 “在这种情况下,您必须在某些时候捕获 EppCommandsExceptions 以避免致命错误。”好的。而我在方法 2 中发现了这一点。
    • 你是在告诉我把我对 createContact 的投掷放在 try catch 语句中吗?
    • @MEM 当然不是。看,当我得到一个未处理的异常时,PHP 会显示整个调用堆栈,包括受影响的文件和行。你得到这个的唯一方法是,如果调用堆栈中指示的每一行都在捕获你的异常类型的 try 块之外。检查那些。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多