使用代码进行异常。有用?

时间:2009-07-03 18:50:12

标签: php exception

我不确定Exceptions是否在每种语言中的工作方式相同,但我使用的是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,它解释了异常类型,异常本身包含文件,行和堆栈跟踪,因此,我无法想到任何可以将代码用于有用的东西的地方。 / p>

4 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:10)

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

答案 2 :(得分:4)

如果您有一个“错误源”可以处理错误代码并将其“提升”为异常,则可以在异常中包含实际错误代码。 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 :(得分:1)

如果可以,最好设置一个异常代码。 也就是说,如果您不更改代码,则根据从数据库获取的数据抛出不同的异常。 OOP中的错误代码是异常类名称本身,因此您可以只用一个try解释每个catch但有多个try { // code here } catch (AccessDeniedException $e) { // do something } catch (Exception $e) { // do something else } 子句。

groups