在Java(或任何其他具有已检查异常的语言)中,在创建自己的异常类时,如何确定是应该选中还是取消选中它?
我的直觉是,如果调用者能够以某种富有成效的方式恢复,那么将调用一个已检查的异常,其中未经检查的异常对于不可恢复的情况更多,但我会对其他人的想法感兴趣.
我一直在决定如何在我的应用程序中处理异常.
如果我的异常问题来自1)通过远程服务访问数据或2)反序列化JSON对象.不幸的是,我不能保证这些任务中的任何一个都成功(切断网络连接,不正确的JSON对象,这是我无法控制的).
因此,如果我遇到异常,我只需在函数内捕获它并返回FALSE给调用者.我的逻辑是,所有调用者真正关心的是任务是否成功,而不是为什么它不成功.
这是典型方法的一些示例代码(在JAVA中)
public boolean doSomething(Object p_somthingToDoOn)
{
boolean result = false;
try{
// if dirty object then clean
doactualStuffOnObject(p_jsonObject);
//assume success (no exception thrown)
result = true;
}
catch(Exception Ex)
{
//don't care about exceptions
Ex.printStackTrace();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我认为这种方法很好,但我真的很想知道管理异常的最佳实践是什么(我应该在调用堆栈中一直冒出异常吗?).
总结关键问题:
跟进/编辑
感谢所有反馈,在网上找到了一些关于异常管理的优秀来源:
似乎异常管理是根据上下文而变化的事情之一.但最重要的是,人们应该如何管理系统中的异常.
另外注意通过过多的尝试/捕获代码腐烂或不给予例外它的尊重(例外是警告系统,还需要警告什么?).
此外,这是m3rLinEz的一个很好的选择评论.
我倾向于同意Anders Hejlsberg和你的看法,大多数来电者只关心操作是否成功.
从这个评论中,它提出了一些在处理异常时要考虑的问题:
我认为这涉及到一个广泛的主题,但是当一切都以最佳方式完成时,除了理想的变体之外,处理程序工作流程的最佳方法是什么.
让我们更具体一点:
一个类有一个方法,该方法对其参数进行操作并返回结果.例如:
public Map<Object,OurObject> doTheWork(OtherObject oo);
Run Code Online (Sandbox Code Playgroud)
我排除的一个可能的结果是,null如果有其他方式,但理想的回归.
处理这种情况有正确的方法("银弹",或所谓的"最佳实践")吗?
我看到其他三个结果:
1 - 该方法返回EMPTY_MAP;
2 - 该方法检查了异常;
3 - 抛出RuntimeException;
如果对该问题没有一般正确答案 - 应该考虑哪些条件?
关于设计的合同原则(简单地说,该方法的责任是照顾输出,假设输入参数是正确的) - 是正确的方法来抛出任何异常或最好是空车返回的结果,但正确在结构中(例如,不为null)