我想避免在发布时出现崩溃,即使出现问题。这就是为什么我不想抛出我知道不会被处理的异常。 在调试模式下,我想这样做,因为在调试过程中出现错误时,尽可能多地获取噪声。
问题在于,如果我做了类似的事情:
if(DEBUG_MODE)抛出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
断言不太方便的另一种情况是当你实现像state这样的模式时。如果对某些州,你期望一种方法永远不会被召唤......
答案 0 :(得分:4)
您可以使用断言。
public void methodSomething(Object o){
assert (o != null); // will throw AssertionError during development
...
}
但你真的应该抓住这些例外并处理它们(:
答案 1 :(得分:4)
如果你不想像你真的那样使用断言,你可以从RuntimeException
派生你的例外。然后,您不必在方法标题中将它们声明为throws
。
话虽如此,你应该真正看看断言,或者正如其他回复所说的那样,一个适当的日志框架。
答案 2 :(得分:3)
不要 EVER 这样做! 应在您的应用程序中始终处理异常。使用日志记录机制来跟踪系统的行为方式,而不是将异常提升到应用程序接口层。
答案 3 :(得分:2)
我建议使用strategy模式和一些dependency-injection机制。基本上创建某种ErrorHandler
:
public interface ErrorHandler {
void handleError(Throwable t);
}
并提供一些实现: NoOpErrorHandler
,RethrowingErrorHandler
和LoggingErrorHandler
。根据environemnt使用最适合您的那个。
但请至少记录例外情况!
答案 4 :(得分:0)
您可以记录此类例外
if(LOGGER.isDebugEnabled())
LOGGER.log(Level.DEBUG, "What went wrong", e);
这允许您在开发中打开这些消息并在生产中将其关闭。