java - 可能因不同原因而失败的方法的标准模式是什么?

标签 java c# .net

<分区>

假设我有一个方法可以在线发布一些内容并返回代表成功/失败的 true/false。

但是,我的方法可能会在不同的步骤失败,例如:

  • 被垃圾邮件拦截器拦截
  • 网络错误
  • 意外异常

我仍然希望该方法简单地返回一个 boolean 值,我也不喜欢让该方法只抛出异常并且每个调用者都必须将其包装在 try/catch 中的想法(我讨厌 try/catch,它是总是丑陋的)。

这个问题有标准的解决方案吗?

我想出的最佳解决方案是让它返回一个枚举,而不是具有不同的可能结果,然后调用者将有一个 switch 语句。有比这更好的解决方案吗?

编辑:我应该更清楚;这是一个 Android 应用程序,用户将在线发布评论,不同的错误将被翻译成用户的消息,例如“垃圾邮件,请稍候再尝试发布”

最佳答案

返回一个 enum 没问题。但是,如果您要从很多地方调用它,您将在多个区域使用相同的错误处理代码(即,相同的 switch 语句)。

也许一种方法是返回一个 boolean 值,但将特定的错误处理逻辑封装在错误处理程序中。所以你会像这样定义一个接口(interface):

interface PostErrorHandler {
    void handle(...);
}

然后你就可以有具体的实现了:

public class SpamErrorHandler implements PostErrorHandler {
    @Override
    public void handle(...) {
        ... //code to deal with spam
    }
}

您发布方法的签名将是:

public boolean post(String content, PostErrorHandler handler) {
    ...
}

然后您将根据错误从 post 中调用 handler.handle(...)

如果您仍然想传达发生的错误类型,您可以使用您提到的方法:返回一个枚举而不是 boolean 值。

就异常而言,不仅仅是丑陋,在这里使用异常是一个坏主意的主要原因是看起来这些类型的错误是预期的。如果是这样,您希望调用者以某种方式处理它们,并且它们似乎是您业务逻辑的一部分。但是使用异常并不是这些错误的正确方法。您通常希望仅在发生意外情况时才使用异常。如果您必须抛出异常,那么最好使用某种状态检查/检查方法来检查输入,以便在输入错误时提醒您。在那种情况下,您可以抛出异常(使其未被检查),因为情况是意外的,因为您希望调用者在调用方法之前使用状态检查方法。

关于java - 可能因不同原因而失败的方法的标准模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30744722/

相关文章:

.net - 如何遍历WebHeaderCollection

c# - 按名称访问 ResourceDictionary

java - 如何使用 Java Reflection 从 ParameterizedType 获取 GenericDeclaration 的类型?

java - '-> NewGlobalRef' 的 Left 必须指向 struct/union 是什么意思?

java - 如何在监听器内传递有关适配器的信息。

java - Jenkins 找不到通过 Eclipse 为 selenium 项目添加的外部 Jars

c# - 如何检测我的网站是否通过主机文件或应用程序中继

c# - 确定托管资源与非托管资源

c# - 无法获取 RowUpdate 事件处理程序以显示 GridView 的错误

c# - 通用函数的委托(delegate)