2012-03-26 104 views
2

只是一个简单的问题,我似乎无法找到适合在线的答案。Java - 简单的异常处理查询

当我有一个try/catch块,并且想要发现错误时,应该使用System.err.println(...)还是应该使用throw new Exception(...)

例如:

if (null==userList || null==credentials) 
    System.err.println("Did you call login() first?"); 
else 
{ 
    try 
    { 
     currentUser=(String) userList.nextElement(); 
     currentPass=(String) credentials.get(currentUser);   
    } 
    catch(NoSuchElementException nsee) 
    { 
     System.err.println("Is properties file blank?"); 
     //Or should this be 
     throw new NoSuchElementException("Is properties file blank?"); 
     nsee.printStackTrace(); 
    } 
} 

编辑:那么,throw并不意味着去里面catch?我可以使用throw而不是catch,还是仅用于方法签名? 在这种情况下捕获错误的正确方法是什么,我将试图确保属性文件不是空白并包含值? 此外,为了清楚起见,我的目标是尽可能地向用户清楚错误是什么,所以他们立即知道他们需要修复它们的属性文件。

+0

我认为他们是不同的问题 - System.err主要是用于调试 – Coffee 2012-03-26 20:20:12

+0

一个奇怪的问题。重新投掷的决定似乎与您是否想要登录它或在何处登录无关。 – onnoweb 2012-03-26 20:20:26

回答

2

取决于你想要做什么。

如果您的方法的合同无法履行如果发生异常(即无法返回您想要的值),则抛出新的异常。 (但是请注意,只是重新抛出新的异常,并没有多大意义,只是声明方法throws NoSuchELementException,让例外传播。)

如果您的合同可以在例外的情况下,满足(即你可以如果没有找到元素,则返回null),那么你应该捕获异常(如果你喜欢,使用System.err.println进行记录),然后继续执行。


上抛出一个新的异常的第一选择一个侧面说明:

你应该总是抛出一个异常,这是适合抽象目前的水平。例如,如果该方法被称为getUserFromList(...),并且由于某些与收集相关的问题而遇到NoSuchElementException,则应该捕获该异常并抛出NoSuchUserException

为了突出差异:

try { 
    currentUser=(String) userList.nextElement(); 
    currentPass=(String) credentials.get(currentUser);   

} catch(NoSuchElementException nsee) { 
       ^^^^^^^ 

    System.err.println("Is properties file blank?"); 
    throw new NoSuchUserException("Is properties file blank?"); 
        ^^^^ 
} 
0

这取决于你想要做什么。

如果您重新抛出异常,函数将退出并且异常将被重新捕获到调用堆栈的更上方。

如果只打印堆栈跟踪,则控制返回到该函数,并且可以继续执行。

下,虽然没有任何意义:

try 
{ 
    currentUser=(String) userList.nextElement(); 
    currentPass=(String) credentials.get(currentUser);   
} 
catch(NoSuchElementException nsee) 
{ 
    throw new NoSuchElementException("Is properties file blank?"); 
} 

如果没有捕获异常,调用上下文负责也无妨。除非你明确想要更改字符串,否则没有意义。

1

这取决于你的目标是什么。如果您的目标是为正在解释日志的人提供更多的上下文,那么您可以将异常链接起来,并将其包装在更具体的域中。

例如,您可以创建一个名为ConfigurationException运行时异常并重新抛出这样的:

} catch(NoSuchElementException nsee) { 
    throw new ConfigurationException("Expected non-blank properties file", nsee); 
} 

通常情况下,最好不要直接登录到System.err(因为你的用户可能不会看它)而是配置一个日志框架(log4j,slf4j,Java日志API等)。然后,如果需要,可以将记录器配置为追加到错误流。

0

这取决于你想要做什么。 如果您只需要关于异常被捕获的信息[例如:对于日志记录,那么syserr就足够了。 但是,如果你想处理这个异常,你应该把它扔到上层并在那里处理它或者在catch块内处理它。 在你的情况下,你应该通过发回有关获取用户名/密码失败的信息来处理它。