【问题标题】:Is is bad practice to write a method that does nothing except throw an exception?编写一个除了抛出异常什么都不做的方法是不好的做法吗?
【发布时间】:2012-01-05 00:22:15
【问题描述】:

标题差不多,但这里有一些背景:

我有一个 ASP.Net MVC 应用程序,我需要在其中检查文件路径列表是否存在。如果任何路径不存在,则返回错误。

目前,我有一个实现 OnException 事件的基本控制器。在这里,任何未处理的异常都会被处理,并且会向用户返回一个错误页面以及异常的消息。

对我来说,进行上述检查的最简单方法是编写一个方法来检查每个路径是否存在,如果其中任何一个失败,我只需抛出(并记录)一个异常。然后由基本控制器处理此异常并将适当的消息返回给用户。

我的问题是这样做感觉不好。我正在编写一个返回 void 的方法,其唯一目的是在极少数情况下抛出异常,即其中一个路径不存在,在大多数情况下它什么也不做。这是个坏主意吗?

【问题讨论】:

  • 是什么让你认为这是错误的?这是一种常见的做法,您甚至可以在 .NET 框架源代码中看到它的示例。
  • 我猜只是感觉不对。但很高兴得到一些反馈,表明情况并非如此。

标签: c# asp.net-mvc asp.net-mvc-3 exception


【解决方案1】:

这并没有错。

.NET 框架也这样做:例如,CancellationToken 有一个方法 ThrowIfCancellationRequested,它只根据某些条件进行抛出或不抛出。

另一个例子:DispatcherVerifyAccess 方法,它检查调用者是否与应该访问的控件在同一个线程上,如果不是则抛出。

【讨论】:

    【解决方案2】:

    有些人可能会说这是一个坏主意,但有时,没有明智的选择。如果您想引发异常以将错误传达给某个调用者(可能通过不透明的第 3 方代码与引发者隔离),那么就这样做。最终仲裁者 - “它有效吗?”

    【讨论】:

      【解决方案3】:

      .net 上存在抛出新的未实现异常的选项,因此您可以创建方法并在以后实现它们。所以这不是一个不好的做法,不好的做法是在将应用程序发布到生产环境时将它们留在那里。无缘无故给出错误是不好的做法。

      对于 TDD(测试驱动开发)也非常有用,您创建方法,然后单元测试因未实现的异常而失败,最后您实现方法以通过测试。

      顺便说一句,这是在回答您问题的标题,但是您应该重命名该问题,因为您的方法会有所作为。如果它做了某事并且总是抛出异常是不好的做法,异常是昂贵的,你应该记录错误并继续前进,没有异常。你最好做一个返回布尔值的 PathExists 函数,这是一个更好的解决方案。 (即使有人无缘无故地给我投票-1...呵呵)

      【讨论】:

      • 我给了你一个 +1 以鼓励你留在网站上,但我也认为这不是一个好的答案:我认为它没有抓住问题的重点。您使用NotImplementedException 的示例完全不同。此外,您答案的第三段又有点无关紧要,您应该将其作为评论发布。
      • 有问题的方法并不总是抛出异常,事实上绝大多数调用都不会抛出异常。仅当其中一个路径不存在时才会引发异常,通常情况并非如此。返回布尔值也意味着我丢失了有关哪个路径无效的信息。顺便说一句,我没有投票给你,你的推理很好解释并且有道理,但它不太适合我的情况。
      • 那么,就是正常的业务,如果失败则抛出异常,如果失败则返回void。所以 then 根本不是一个坏习惯,它只是一个检查某些东西的 void 方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2020-11-10
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多