系统化PHP中的Web应用程序的错误代码?

时间:2010-03-24 17:56:49

标签: php oop error-handling

我正在开发一个基于类的php web应用程序。我有一些对象正在交互的地方,并且我在某些情况下使用错误代码与最终用户进行通信 - 通常在表单值丢失或无效时。在这些情况下,例外情况是没有根据的(我不确定我是否可以避免出现例外情况)。

在一个对象中,我有大约20个代码编号,每个代码编号对应于面向用户的消息,以及面向管理员/开发人员的消息,因此双方都知道发生了什么。现在我已经多次处理了代码,我发现很难快速找出我已经使用过的系列中的代码编号,所以我不小心创建了相互矛盾的代码。例如,我今天只用12,13,14和15做了。

如何更好地组织这个以便我不会创建冲突的错误代码?我应该创建一个单独的类,errorCodes,它有一个包含所有类的所有错误代码的主列表,在整个Web应用程序中将它们系统化?或者,在适当的时候,每个对象应该有自己的一组错误代码,我只是在对象的注释中保留一个列表,在我进行时使用和更新它?

<小时/> 编辑:所以我喜欢在类中使用常量或命名常量的建议。这给了我一个地方,我以编程方式定义并跟踪错误代码及其消息。

下一个问题:我为这个类的错误代码和消息提供了什么样的接口?我是否在类中执行triggerError(20)之类的操作,然后提供一个公共方法来返回错误代码,字符串常量以及面向用户和管理员的消息?

4 个答案:

答案 0 :(得分:8)

您可以为所有错误代码创建一些defines来创建命名常量

define('ERROR_CODE_SQL_QUERY', 1);
define('ERROR_CODE_PAGE_NOT_FOUND', 2);
define('ERROR_CODE_NOT_ALLOWED', 3);
// and so on

然后,使用代码中的常量:

if ($errorCode == ERROR_CODE_SQL_QUERY) {
    // deal with SQL errors
}


有了这个,你的代码中没有任何地方你会使用数值:无处不在(除了你放define s的开启和唯一文件),你将使用这些代码。

这意味着:

  • 错误风险较小,因为所有数值仅在一个文件中设置
  • 错误风险降低,因为您将使用常量,其名称表明其含义
  • 代码更容易阅读。


另一个想法可能是创建一个类来处理错误:

class Error {
    const CODE_SQL_QUERY = 1;
    const CODE_PAGE_NOT_FOUND = 2;
    const CODE_NOT_ALLOWED = 3;

    // Add some methods here, if needed
}

然后,使用这样的东西:

if ($errorCode == Error::CODE_SQL_QUERY) {
    // deal with SQL errors
}


哪一个最好

这可能是个人偏好的问题......如果您需要添加一些方法来处理错误,使用类可能会有用。另外,定义也是一个很好的解决方案。

答案 1 :(得分:1)

至少,您可以将代码数量提升为类常量或成员吗?

class MyErrorProneClass { 
    const TURNED_INTO_A_NEWT = 12;
    ...

    public function dontBurnMe() {
        // echo your error here using self::TURNED_INTO_A_NEWT
}

通过这种方式,您可以在使用它们的同一位置管理错误,而不必维护大型中央文件。我过去曾尝试过这种效果,但很难跟上。

以编程方式生成错误编号可能是更好的长期解决方案。如果您可以使用有关文件或行号的信息(分别为__FILE____LINE__),那将有所帮助。

希望至少朝着正确的方向前进。

谢谢,乔


编辑:

类成员将遵循以下语法:

class MyErrorProneClass { 
    protected static $turnedIntoANewt = 12;
    ...

    public function dontBurnMe() {
        // echo your error here using self::$turnedIntoANewt
}

由于常量默认是公共的,因此如果需要,可以直接从其他类访问它们。因此,从外部来看,错误将被引用为:

MyErrorProneClass::TURNED_INTO_A_NEWT

要与消息关联,您可以使用从错误ID(和前端/后端)到显示字符串的映射(在数据库中或在某些本地化文件中)。对消息使用密钥并不是最佳选择,但它允许您在不更改代码的情况下更改错误消息。

答案 2 :(得分:0)

如果您不知道使用trigger_error()可能是个主意,如果您想向用户显示更好的错误消息,还可以使用错误处理程序。

答案 3 :(得分:0)

您是否考虑过使用exceptions?对于您的问题,它们可能是一个很好的选择,虽然现在将它们添加到您的项目中可能需要进行一些重组。

您可以扩展基本异常类,以便在用户/开发人员错误消息分离方面适合您的问题。