Java异常:返回或作为返回发送(函数输出)?

问题描述:

以下是用法:我正在编写旨在执行特定功能/任务(例如createBuilding,destroyBuilding等)的类和函数。我遵循的设计是该函数不处理/处理任何错误情况。调用者有责任采取适当的行动,以防出现错误/异常情况。我可以通过两种方式做到这一点:Java异常:返回或作为返回发送(函数输出)?

public void caller { 
    try { 
     A.createBuilding(); 
    catch (Exception e) { 
     process exception 
    } 
} 

第一种方法:

public class A { 
    public String createBuilding throws Exception { 
    try { 
     blah blah blah 
    catch (Exception e) { 
     throw new Exception(e); 
    } 
} 

第二种方法:

public class A { 
    public String createBuilding { 
    StringBuffer sb = new StringBuffer(); 
    try { 
     blah blah blah 
    catch (Exception e) { 
     sb.add(e.toString()); 
    } 
    return sb.toString(); 
} 

The user in the second case does the following: 
public void caller throws Exception { 
     String st = A.createBuilding(); 
     if (st.contains("Exception")) 
     do something; 
} 

假设调用的函数总是返回一个字符串。

有关哪种方法更好的任何意见?我忽略的任何陷阱/问题?

欣赏所有的帮助!

使用第一个课程,即使用例外。

第二个打破错误处理的研究多年,不这样做。

原因: 如果您使用的例外,你将能够充分利用在Java构建整个错误处理框架周围像Thread.uncaughtExceptionHandler异常和堆栈跟踪也在使用错误时抛出等等是错误处理的首选方式并且将被推荐在返回的自定义字符串,以找出错误

+1

我同意这一点...... – Albinoswordfish

返回一个字符串,删除信息(如堆栈跟踪。)如果你的方法不处理异常,它不应该抓住它,让来电者处理:

public void createBuilding() throws Exception { 

     blahBlahBlah(); 
    } 
+0

部分仅对'Exception'有效,对于'RuntimeException'则不是。令人遗憾的是,'Exception'肯定被太多开发者滥用。 –

+0

@Marius,答案中的'Exception'用作示例,用实际使用的异常类型替换。重点是*如果你不对它们采取行动,你不应该捕捉并重新抛出异常*。 – rsp

+0

这正是我面对的问题。如果我得到运行时异常,将其发回给调用者的唯一方法是捕获异常并将其抛回(新投掷...)。如果有很长的一堆电话,每个呼叫者都需要这样做,那很痛苦。所以如果我有一些像来电A->来电B->来电C和C引发一个运行时异常,什么是最好的方式来打电话A没有每个人捕获并重新扔它? – Rahul

使用异常的唯一缺点是它们慢了一点,否则它们只能提供优势(堆栈跟踪,使用专用处理程序的可能性,易于使用的状态,内置等)。如果性能影响阻止你使用它们,你应该切换到ASM或C,如果你这样做,不要忘记返回0成功和其他任何失败,以便你有足够的代码足够可能错误;)

没有真正的,继续前进,并通过一切手段使用例外。除非你能想出许多其他人可以看到有效的理由(所以不仅仅是你自己)。