我应该在我编写的每个方法中使用错误处理吗
Should I use error handling in each method that I write
我有两个 类,MyFirstClass 和 MySecondClass。我在 MyFirstClass 中创建了 MySecondClass 的对象。
如果在 MySecondClass 中发生任何类型的错误,我如何通过 try{}catch(/Exception $e){}
处理这些错误
假设由于以下原因可能会出现错误,
- 数组的未定义索引
- 未定义的变量
- SQL 查询异常
示例代码:
class MyFirstClass {
public function index() {
try {
$mySecondClass = new MySecondClass();
$mySecondClass->sampleMethod();
} catch(\Exception $e) {
error_log($e->getMessage(), 0);
$this->doSomethingElse();
}
}
}
我应该在我编写的每个方法中使用错误处理吗?请分享您的建议。
Try/Catch/throw/log 散布在方法和代码中不是一个好习惯。当你想到这个时,你应该问以下问题:
您具体要如何处理该异常?如果答案是吞下,我会说你需要三思而后行。如果状态因为 catch 块中的吞噬异常而损坏,那么调用堆栈中更高层的某些方法可能会再次抛出异常——现在如何处理这个异常?再次相同的循环?它很快就会把你引向更大的混乱。
您可能 有节制地 想要遵循立即捕获异常的模式,当您确实知道可以用它做某事时(比如在 sql 情况下吞下并重试超时异常)此外,如果您想在日志中捕获更多上下文特定的详细信息,您可能希望立即捕获异常。在那种情况下,捕获并重新抛出新的异常,将原始异常包装为内部异常。
所以简而言之 - 在应用程序根级别或服务边界级别有异常 handling/logging 是件好事。
话虽如此 - 在集中位置,您还可以配置如何处理特定类型的异常。例如:
作为业务层数据验证的一部分抛出的错误请求异常只会 return 400 错误请求(在 Web 应用程序的情况下)
如果异常是 SqlException 类型 - 向客户端抛出一般异常并使用一些跟踪 ID 并将详细异常记录到 eventlog/db/application 洞察力等
如果业务层的外部系统出现任何异常 - 再次向客户端发送一般异常,并向提供外部服务的系统发送通知电子邮件。
这些只是一些例子,围绕异常处理的良好实践也隐含地促进了良好的设计。例如:为什么不使用安全防护来确保传递给方法的参数不为 null 并抛出 ArgumentNullException 而不是捕获 NullReferenceException 然后通过在方法级别设置 try/catch/log 来捕获参数值。
我发布了有关异常处理和日志记录良好做法的问题 here。请检查它是否有很好的辩论和讨论以及各种建议和良好做法。
我有两个 类,MyFirstClass 和 MySecondClass。我在 MyFirstClass 中创建了 MySecondClass 的对象。
如果在 MySecondClass 中发生任何类型的错误,我如何通过 try{}catch(/Exception $e){}
假设由于以下原因可能会出现错误,
- 数组的未定义索引
- 未定义的变量
- SQL 查询异常
示例代码:
class MyFirstClass {
public function index() {
try {
$mySecondClass = new MySecondClass();
$mySecondClass->sampleMethod();
} catch(\Exception $e) {
error_log($e->getMessage(), 0);
$this->doSomethingElse();
}
}
}
我应该在我编写的每个方法中使用错误处理吗?请分享您的建议。
Try/Catch/throw/log 散布在方法和代码中不是一个好习惯。当你想到这个时,你应该问以下问题:
您具体要如何处理该异常?如果答案是吞下,我会说你需要三思而后行。如果状态因为 catch 块中的吞噬异常而损坏,那么调用堆栈中更高层的某些方法可能会再次抛出异常——现在如何处理这个异常?再次相同的循环?它很快就会把你引向更大的混乱。
您可能 有节制地 想要遵循立即捕获异常的模式,当您确实知道可以用它做某事时(比如在 sql 情况下吞下并重试超时异常)此外,如果您想在日志中捕获更多上下文特定的详细信息,您可能希望立即捕获异常。在那种情况下,捕获并重新抛出新的异常,将原始异常包装为内部异常。
所以简而言之 - 在应用程序根级别或服务边界级别有异常 handling/logging 是件好事。
话虽如此 - 在集中位置,您还可以配置如何处理特定类型的异常。例如:
作为业务层数据验证的一部分抛出的错误请求异常只会 return 400 错误请求(在 Web 应用程序的情况下)
如果异常是 SqlException 类型 - 向客户端抛出一般异常并使用一些跟踪 ID 并将详细异常记录到 eventlog/db/application 洞察力等
如果业务层的外部系统出现任何异常 - 再次向客户端发送一般异常,并向提供外部服务的系统发送通知电子邮件。
这些只是一些例子,围绕异常处理的良好实践也隐含地促进了良好的设计。例如:为什么不使用安全防护来确保传递给方法的参数不为 null 并抛出 ArgumentNullException 而不是捕获 NullReferenceException 然后通过在方法级别设置 try/catch/log 来捕获参数值。
我发布了有关异常处理和日志记录良好做法的问题 here。请检查它是否有很好的辩论和讨论以及各种建议和良好做法。