【问题标题】:Using a code for an exception. Useful?使用异常代码。有用?
【发布时间】:2010-11-08 00:06:04
【问题描述】:

我不确定异常在每种语言中是否以相同的方式工作,但我正在使用 PHP,我想知道我什么时候做这样的事情:

if (!$this->connection[0]->query($this->query))
 throw new QueryFailedException($this->connection[0]->error);

是否需要在第二个参数中提供代码?例如:

if (!$this->connection[0]->query($this->query))
 throw new QueryFailedException($this->connection[0]->error,123);

现在代码是 123...我想不出需要这个。有吗?在这种情况下,消息包含查询,异常名称是 QueryFailedException,它解释了异常类型,异常本身包含文件、行和堆栈跟踪,所以,我想不出任何可以将代码用于有用的地方。

【问题讨论】:

标签: php exception


【解决方案1】:

如果可以的话,在异常代码中设置是非常好的。 也就是说,如果您不更改代码以根据从数据库中获取的数据抛出不同的异常。 OOP 中的错误代码是异常类名称本身,因此您可以在一个 try 中解释它们中的每一个,但可以使用多个 catch 子句。

try {
  // code here
} catch (AccessDeniedException $e) {
 // do something
} catch (Exception $e) {
  // do something else
}

【讨论】:

    【解决方案2】:

    如果您有一个适用于错误代码的“错误源”并且您将其“提升”为异常,您可以在异常中包含实际的错误代码。 a)它没有害处,b)也许您不想为每个可能发生或可能不会发生的单个错误代码设置一个异常类(在运行的系统中几乎没有人关心)。
    我们以MySQL server errors 为例。您可以为每个代码创建一个类

    class MySQLException_ER_HASHCHK extends MySQLException
    class MySQLException_ER_NISAMCHK extends MySQLException
    class MySQLException_ER_NO extends MySQLException
    class MySQLException_ER_YES extends MySQLException
    class MySQLException_ER_CANT_CREATE_FILE extends MySQLException
    class MySQLException_ER_CANT_CREATE_TABLE extends MySQLException
    class MySQLException_ER_CANT_CREATE_DB extends MySQLException
    class MySQLException_ER_DB_CREATE_EXISTS extends MySQLException
    class MySQLException_ER_DB_DROP_EXISTS extends MySQLException
    ....
    

    但实际上……谁在乎呢?谁真的会单独抓住他们?在几乎所有情况下,应用程序的代码中只会有一个 catch(MySQLException $mex) ,也许它只是在寻找一个特定的代码,它对编码器来说几乎没有区别两个 catch 块或一个 if/switch 块。现在你有很多“死”的类,没有人——除了解析器——对它们不屑一顾。 (另一方面,“所有值得做的事情都值得过度”)
    即使您确实提供了一些粒度,我认为超越例如每个 SQLState 都有一个异常类(这有意义吗?sqlstate?不知道,只是一个例子)

    class MySQLException_HY000 extends MySQLException
    class MySQLException_HY001 extends MySQLException
    class MySQLException_XA100 extends MySQLException
    class MySQLException_XA102 extends MySQLException
    

    然后你可能想要包含错误代码 - 为什么即使/即使你的代码通常不评估它也会丢失这些信息?

    【讨论】:

      【解决方案3】:

      错误代码是在没有面向对象语言时使用的功能。唯一可以帮助您了解出了什么问题的是错误代码。在面向对象的语言中,对象就是您的错误代码。 除非在特定情况下,不止一件事可以引发完全相同的错误并且它们以不同的方式处理,否则放弃它。 此外,如果您留下消息而不是无意义的错误代码,您将为调试代码的人提供更好的解释,因此如果您觉得异常需要更多信息,请填写错误消息字段。

      【讨论】:

        【解决方案4】:

        错误代码是一个可用于提供更详细信息的字段。例如,如果您有两件事可以生成相同的异常,则可以使用该代码提供更多详细信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-04
          • 2013-08-29
          • 2014-06-12
          • 2012-03-31
          • 2022-11-07
          • 1970-01-01
          相关资源
          最近更新 更多