我为Android编写了一个生产力应用程序。它允许您切换系统设置,如蓝牙、妻子、屏幕亮度、音量、铃声、移动数据、飞机模式等。不幸的是,我发现设备制造商以各种可能的方式修改操作系统,禁用功能,请求额外的权限,或者只让系统应用程序使用。也就是说,在安卓系统上切换WiFi需要android.permission.CHANGE_WIFI_STATE许可,但大多数三星设备也需要android.permission.ACCESS_WIFI_STATE。移动数据交换在许多设备上被简单地禁用。
这使得无法预测我的代码将如何在特定设备上工作,或者在未来版本的OS上工作。但与此同时,我绝对不想让我的应用崩溃,因为没有比这更糟糕的了。因此,为了安全起见,我一直在使用有时被称为“口袋妖怪异常处理”(Gotta‘called!):
try {
//Do stuff
} catch (Exception e) {
//Log an error, send crash report, etc.
}
//Keep calm and carry on我知道,这通常被认为是一个不好的做法,但我只是找不到一个更好的方法来处理这种情况。我无法预测出什么会出错的所有可能性。我大多数执行操作的方法如下所示:
private boolean switchWiFi(boolean state) {
try {
WifiManager wm = (WifiManager)getSystemService(WIFI_SERVICE);
wm.setWifiEnabled(state);
return true; //Executed successfully
}
catch (Exception e){
//Give user a notification about an error, rather than crash
showErrorNotification("Couldn't switch WiFi.");
if(BuildConfig.DEBUG){Log.getStackTraceString(e);}//Log exception stack trace
return false; //Execution failed
}
}是否有更好的方法来处理异常?
发布于 2013-03-04 11:22:49
当调用的API抛出未知的异常时,我认为除了捕获所有异常(有时也是Throwables )之外,没有其他方法。+1 Jeroen Vannevel的评论也是。
无论如何,一个通用的接口可能能够稍微改进代码:
public interface Command {
run() throws Exception;
String getName();
}然后,您可以使用像WifiSwitcher这样的实现,并逐一调用它们:
final List<String> errors = new ArrayList<String>();
for (final Command command: commands) {
try {
command.run();
} catch (final Exception e) {
errors.add("Could not perform command: " + command.getName());
if (BuildConfig.DEBUG) {
Log.getStackTraceString(e);
}
}
}
if (errors.isEmpty()) {
return true;
}
showErrorNotification(errors);
return false;(我没有测试或编译上面的代码。)
发布于 2014-01-09 09:42:33
尝试将捕获的异常作为事件发送到(然后它不会显示为App )。
下面是如何在Android中轻松地完成这一任务:
http://tekkies.co.uk/report-caught-exceptions-as-google-analytics-events/

https://codereview.stackexchange.com/questions/23402
复制相似问题