paint-brush
异常的真正重要性:PHP 与 Golang 中的错误处理by@shcherbanich
8,350
8,350

异常的真正重要性:PHP 与 Golang 中的错误处理

回顾过去,我们处理错误的方式显示了开发人员的需求和挑战如何随着时间的推移而变化。
featured image - 异常的真正重要性:PHP 与 Golang 中的错误处理
Filipp Shcherbanich HackerNoon profile picture

最近,我与一位像我一样也是软件开发人员的朋友进行了一次有趣的谈话。我们正在讨论不同的编程语言如何处理错误,这导致了一些分歧。我们想知道哪种错误处理方法最有效,有哪些优点和缺点,甚至我们是否可以毫无例外地生活。这次谈话激发了我更深入地探索各种编程语言中的错误处理的好奇心,现在我很高兴分享我所学到的东西。


在我的日常工作中,我使用 PHP 和 Golang——这两种语言具有不同的错误处理方法。在本文中,我想带您踏上一段旅程,我们将比较这些语言如何处理错误。但还有更多有待发现!我们还将探索替代的错误处理方法,并找出最适合不同任务的方法。因此,准备好对编码世界中的错误处理进行有趣的探索吧。

错误处理方法:深入探讨 PHP 和 Golang

编程中的错误处理非常重要。回顾过去,我们处理错误的方式显示了开发人员的需求和挑战如何随着时间的推移而变化。


最初,错误代码返回占主导地位。这些简单的(通常基于整数)返回指示成功或特定错误类型。虽然它们很有效,但它们的缺点是它们经常使代码变得混乱并使其可读性较差。为了破译错误,人们必须不断地查阅文档或错误代码定义。


异常作为一种更直观的解决方案出现:每当发生错误时,程序都会抛出异常,而不是返回代码,从而允许开发人员在代码的指定部分捕获它。这种方法因其清晰性和集中错误处理的能力而受到欢迎。


不久之后,错误回调得到了普及,特别是在异步环境中。这个想法很简单:与其等待错误,为什么不传递一个函数(回调)来处理它呢? onError(callback)模式在 JavaScript 中变得流行,使得错误处理更加主动。


一些编程语言引入了特殊函数,允许您处理错误和异常。例如,在 LUA 中,有error()pcall() 。它们提供了传统错误代码和异常机制的混合。


与前面描述的处理错误的方法并行,诸如 monad 之类的概念也出现在函数式编程语言中。它们将一个值包装在指示成功或失败的上下文中,从而允许更具表现力和安全的错误处理。除此之外,它们还可以与其他各种功能模式一起使用,从而实现强大而简洁的错误处理和操作链接。


但让我们把焦点转移到 PHP 和 Golang 上。 PHP 具有广泛的错误处理功能。在 5.0 版本之前,这种编程语言根本没有例外。开发人员使用了各种各样的错误处理方法,例如trigger_error函数,它生成用户级错误/警告/通知消息; set_error_handler函数,它允许您定义脚本中错误处理的回调,由于函数执行不成功等而主动返回“false”或“null”。


其中许多方法仍然在 PHP 代码中广泛使用。尽管如此,随着异常和处理异常的语言结构的出现,它们在开发人员中获得了广泛的流行,因为它们提供了比传统错误处理方法更多的优点,例如,有关错误及其发生位置的更详细信息,能够以结构化方式处理错误,并提高复杂代码的可读性。


另一方面,Golang处理多重返回模式,其中函数同时返回结果和错误,强调显式错误检查而不是隐式异常处理。 Golang 的创建者坚持编程语言应尽可能清晰和简单的原则。其设计的主要目标是为编写代码提供清晰、高效的语言结构,特别是在谷歌这样的大型组织中。这样,开发人员可以专注于解决问题,而不必浪费时间争论代码风格或试图理解复杂且令人困惑的代码。

PHP 和 Golang 中的错误处理:可读性比较

PHP 的异常处理方法

如前所述,PHP 具有许多错误处理功能,但异常是当今最流行的方法。虽然这种方法很直观并且反映了许多其他编程语言,但它可能导致嵌套结构,即处理多个潜在错误源时的情况。这种“try-catch”嵌套会使代码更难阅读,尤其是对于新手来说。让我们来分解一下。

优点:

  • 简洁。 PHP 的异常处理可以使代码变得简洁,从而减少所需的总行数。这在处理一段代码中的各种错误类型时特别有用。它提供了集中的错误处理机制。
  • 普遍性。与许多其他语言类似,PHP 的异常机制为许多开发人员所熟悉,并且确实可以轻松地从其他编码背景过渡到 PHP。目前最流行的编程语言都有这种处理错误的方式。

缺点:

  • 流动中断。主要缺点是可能会模糊代码的逻辑流程。随着异常的传播,追溯原始错误源可能会很困难,这会使调试变得复杂。
  • 过度依赖。过度依赖异常也可能导致过度使用,将微不足道的错误作为异常抛出,从而使代码不必要地复杂化。

Golang 的显式错误处理

Golang 采用了独特的方法。函数除了常规返回值之外,还返回错误值,而不是异常。然后开发人员有责任检查并处理此错误。虽然这可能会使 Go 代码变得更长,但它可以清楚地了解错误何时何地可能发生。


优点:

  • 控制流程简单。由于 Go 不使用异常进行错误处理,因此不需要“try-catch”块——它降低了控制流的复杂性。
  • 灵活性。 Golang 的方法允许开发人员根据具体情况决定如何处理每个错误,无论是传播错误、记录错误还是采取纠正措施。这种控制可以带来更强大的应用程序。

缺点:

  • 赘言。最常见的批评之一是 Go 的错误处理可能会导致冗长的代码。可能失败的函数必须返回一个额外的错误值,处理这些错误通常会导致重复的错误检查样板。
  • 监督的潜力。由于错误处理是明确的,因此开发人员可能会忘记或故意选择不检查错误。
  • 缺乏背景。虽然 Go 的标准错误类型简单且一致,但它通常缺乏有关错误发生位置和原因的上下文信息。尽管有包和模式可以添加更多上下文,但它并不像一些开发人员希望的那样集成。

性能和资源消耗的差异

PHP 和 Golang 之间的争论经常涉及编程的各个领域,但最重要的争论领域之一是它们在性能和资源消耗方面的差异,尤其是在错误处理方面。


在 PHP 的情况下,异常允许创建堆栈跟踪,这有助于跟踪导致错误的调用顺序。该跟踪为调试提供了有价值的信息。然而,生成这样的跟踪,特别是在复杂的应用程序中,需要计算资源和内存。因此,当频繁抛出异常时,可能会减慢应用程序的速度并增加其资源占用量。


另一方面, Golang 的方法避免了异常堆栈跟踪创建的开销。相反,函数返回必须由程序员显式检查的错误值。这种方法可以提高性能并减少资源消耗。但是,它确实将责任直接转移到了开发人员的肩上,这在某种程度上也是资源密集型的。


使用 PHP 基于异常的方法还是 Golang 的显式错误处理之间的决定不仅仅是性能和资源的问题,更多的是权衡的问题。异常提供了大量的调试信息,但它们是有代价的;反过来,Golang 的方法是资源友好型的,但需要认真进行错误管理。

结论:无例外地生活是否可能且必要?

PHP 诞生于 Web 开发需求,优先考虑简单性和共享托管。它的错误处理使其对 Web 应用程序的开发人员友好。另一方面,由软件巨头 Google 创建的 Golang 是为现代系统编程而设计的。它强调使用多个返回值的显式错误处理:这种范例促进更清晰的代码流并将错误作为常规值,提供更精确的控制。


不同的起源和目标塑造了他们的错误处理哲学。 PHP 旨在在 Web 开发人员中广泛采用,重视可访问性和宽容性。相比之下,Golang 追求性能、清晰度和稳健性,是可扩展和可维护系统的理想选择。


他们的做法不可避免地引发了关于例外必要性的争论。


虽然无异常编码可能看起来令人畏惧,但它促使开发人员转向更透明、可预测的代码。然而,它可能并不普遍适用,并且它强调了理解特定语言意图和应用程序的需要。


对我来说,尽管异常可能有缺点,但如果可能的话,我是更喜欢在工作中使用异常的开发人员之一。 Golang 方法让我感觉不太舒服,但它也迫使我更多地思考我正在做什么以及我想要实现什么。您更喜欢使用哪种方法?如果您在评论中分享这些信息,我将很高兴!