2015-07-19 207 views
2

如果您有由一群其他对象的对象,即:优雅的方式失败

class A{ 
    B b {get;} 
    C c {get;} 
    private A(){ 
    b = B.Make(); 
    c = C.Make(); 
    } 
} 

和类BC被设置为返回null当抛出一个异常时,是否有更好的方法比在空成员中检查null为012,否则它会失败?

诚然我的异常管理的理解很差,但它将使意义BC不处理自己的异常,而是让他们冒泡到A,从而规避了整个空惨败。但是,如果他们是独立使用A的课程呢?

+0

为什么你想这样做?你想要任何异常来清除所有'A's值? –

+0

如果A中的任何内容不好,A不好,那么是的 – 2c2c

+0

你*可以*使用反射,但是这会很慢并且很糟糕。为什么不'''将'catch'块内的所有值'归零。 –

回答

1

通常应该避免根本返回null,Make()函数应该抛出异常。如果它们的例外程度太低,则应将其包装或替换为自定义例外。

现在,调用者(A)可以将Make()调用放置在try-catch块中,以再次用他自己的方式替换异常,但他不需要,并且您不必处理null -checks。

0

不可否认,我对异常管理的理解很差,但B和C不应该处理他们自己的异常,而是让他们冒泡到A,从而绕过整个空洞的失败。但是如果他们是独立于A的使用类呢?

如果B和C可以以有意义的方式从错误中恢复,那么他们处理自己的错误没有任何问题。例如,如果必须连接到服务器,并且不能这样做,他们可以继续尝试而不必抛出错误。显然,你需要某种方式来表明他们的连接状态。

那么这对于A类意味着什么?它取决于A是否要求成功创建的B和C被认为处于有效状态。 如果A需要B或C,那么在这种情况下(没有错误抛出),它将由A来检测它不处于有效状态,并抛出(或以其他方式处理错误),以便创建A知道A是无效的。 如果A不需要B或C,那么在这种情况下就像B和C一样,你不必抛出(A是有效的),但是B和/或C是空的,你必须检查访问它。

底线是,B和C的行为应该对B和C有意义。如果他们应该抛出,他们应该抛出。 然后你应该担心A. A的行为同样应该是有意义的A.

你似乎担心不必检查空,但是你把它曾经路径(扔,扔无),你会必须检查东西。要么检查是否为空,要么尝试捕获。

你可能也想考虑重新设计A类。也许这是一个有争议的问题。 为什么B和C包含在A类中?也许你可以简单地将B和C传递给需要B或C的A的公共方法?