在Java中仅在调试模式下抛出异常

4
我希望在发布时避免崩溃,即使出现问题。这就是为什么我不想抛出异常,因为我知道它们不会被处理。
在调试模式下,我希望这样做,因为在调试过程中,尽可能多地获取有关错误的信息是很好的。
问题在于,如果我像这样做:
if (DEBUG_MODE) throw e;
那么我需要指定该方法抛出异常,但我不想这样做,因为在发布中不是真的需要这样。
应该如何处理这个问题?
编辑
PS
我的问题没有表述清楚,对不起。
在我的情况下,断言并不是很方便。问题在于,我已经知道某些事情出了问题,因此我没有任何东西可以断言。为了更清楚地说明,我有意外的异常。当然,你可以说:写出不会出现意外异常的代码。但是,如果出现问题,我不希望应用程序崩溃。现在我添加了一个这样的函数:
public static void unexpectedException(String string, Exception e) {
    if (Build.DEBUG) {
        MyApp.errorLog(string);
        throw new RuntimeException(e);
    } else
        MyApp.errorLog(string, e);
}

尽管您的所有答案都是正确的,但我会选择最接近我所做的答案。
PS2
另一个情况是当您实现像状态这样的模式时,断言不是真正方便的情况。如果对于某个状态,您希望某个方法永远不会被调用...

4
最好的方法是始终处理异常。 - vulkanino
对于公有方法/构造函数,始终使用异常 - 充分记录并处理它们 - 对于私有方法则使用断言。如果客户端在使用您的应用程序时出现问题,您必须向其发出信号。 - cesmarch
5个回答

5
您可以使用断言。
public void methodSomething(Object o){

   assert (o != null);  // will throw AssertionError during development

   ...

}

但是你真的应该捕获这些异常并处理它们(:


5

不要永远这样做!
在应用程序中应该一致地处理异常。使用日志机制来跟踪系统的行为,而不是将异常抛到应用程序接口层。


4
如果您不想使用断言(其实您应该使用),您可以从RuntimeException派生您的异常。这样,您就不必在方法头中声明它们为throws
话虽如此,您真的应该看看断言,或者像其他回复所说的那样,使用适当的日志框架。

2
我建议使用 模式以及一些 机制。基本上创建某种类型的 ErrorHandler
public interface ErrorHandler {
    void handleError(Throwable t);
}

提供了几个实现:NoOpErrorHandlerRethrowingErrorHandlerLoggingErrorHandler。根据环境选择最适合您的那一个。
但是请至少记录异常!

0

您可以像这样记录异常

if(LOGGER.isDebugEnabled())
    LOGGER.log(Level.DEBUG, "What went wrong", e);

这样可以让你在开发时打开这些消息,在生产环境中关闭它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接