【问题标题】:PHP exceptions: where to put dynamic data? [closed]PHP 异常:将动态数据放在哪里? [关闭]
【发布时间】:2012-01-15 11:53:21
【问题描述】:

我正在将 PEAR 的Text_LanguageDetect 的错误处理重写为异常,不知道如何处理异常中的动态数据:

throw new Text_LanguageDetect_Exception(
    'Language database does not exist.',
    Text_LanguageDetect_Exception::DB_NOT_FOUND
);

这里我想包含试图打开的文件名,但问题是放在哪里

  1. Language database /path/to/file.ext does not exist.
  2. Language database "/path/to/file.ext" does not exist.
  3. Language database does not exist: /path/to/file.ext
  4. Language database does not exist: "/path/to/file.ext"

1+2 是正确的英文句子,而 3+4 可以很容易地 grep 代码中的消息。另外,用代码提取文件名在 3+4 中更容易。

我应该使用哪一个,为什么?


另一个问题是:我应该把文件名放在哪里?

当我把它放在异常消息中时,如果攻击者看到该消息,它可能会向攻击者提供有关服务器上文件结构的信息。没有文件名,就很难调试。

【问题讨论】:

  • 由于应该在生产服务器上禁用错误消息,我没有看到有关攻击者深入了解文件结构的问题。预测组件用户的错误配置不是组件编写者的责任。关于我更喜欢​​哪条消息:4.除此之外,它是一个民意调查类型的问题,我猜不适合 SO。
  • 使用sprintf(),这样您就可以更轻松地解耦和更改内容,同时保持代码干净。接下来,检查整个组件的样式,以便始终保持相似,这将减少学习曲线。提供对 API 用户处理异常有用的所有信息。
  • 这不是民意调查。我想得到答案为什么我应该使用一个选项,而不是谁使用什么。
  • @cweiske 就是这样。他们不会给你理由 :) 我会选择 4,因为它对我来说最容易理解(这和其他任何理由一样好)。我可能会在其中添加一个“at”以使其成为一个完整的句子:语言数据库不存在于“/path/to/file.ext”。另外,我可能会添加解决方案的建议,例如检查文件路径并确保其可读或其他内容。

标签: php exception


【解决方案1】:

您应该使用对您来说更具可读性的消息格式。依赖代码中的异常消息不是一个好习惯。如果您需要这样做,您可能应该将异常子类化。

第二个问题:你不应该在生产环境中向用户显示详细的错误,所以我不认为包含文件名是一个问题。

【讨论】:

    【解决方案2】:

    在抛出异常时,有一个环境变量来告诉您的代码您是处于开发中还是运行中是很有帮助的。这可以在您存储其他系统范围设置的位置进行设置。

    如果设置为开发,则输出错误,使调试更容易,如果设置为实时,则输出对最终用户有帮助的错误(或根本没有错误并优雅处理),则不会提供任何信息都会成为攻击者。

    【讨论】:

    • 这并没有回答他的问题。
    • 不适合通用库。梨就是这样的一个存储库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2016-06-02
    • 1970-01-01
    • 2012-07-06
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多