在阅读了一些关于AppDomain.UnhandledException和Application.DispatcherUnhandledException之间差异的优秀帖子之后,似乎我应该同时处理它们.这是因为用户可以从主UI线程抛出的异常(即Application.DispatcherUnhandledException)中恢复的可能性更大.正确?
另外,我是否还应该让用户有机会继续这两个程序,或者仅仅是Application.DispatcherUnhandledException?
下面的示例代码处理AppDomain.UnhandledException和Application.DispatcherUnhandledException,并且两者都为用户提供了尝试继续的选项,尽管有异常.
[谢谢,下面的一些代码从其他答案解除]
App.xaml中
<Application x:Class="MyProgram.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="App_StartupUriEventHandler"
Exit="App_ExitEventHandler"
DispatcherUnhandledException="AppUI_DispatcherUnhandledException">
<Application.Resources>
</Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)
App.xaml.cs [编辑]
/// <summary>
/// Add dispatcher for Appdomain.UnhandledException
/// </summary>
public App()
: base()
{
this.Dispatcher.UnhandledException += OnDispatcherUnhandledException;
}
/// <summary>
/// Catch unhandled exceptions thrown on the main UI thread and allow
/// option for user to continue program.
/// The OnDispatcherUnhandledException method below for AppDomain.UnhandledException will handle all other exceptions thrown by any thread.
/// </summary>
void AppUI_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{ …Run Code Online (Sandbox Code Playgroud) c# wpf exception-handling uncaught-exception uncaughtexceptionhandler
从上周开始,我们的应用程序出现了很多例外.我们使用GMS 11.0.2
Fatal Exception: java.lang.IllegalStateException: Results have already been set
at com.google.android.gms.common.internal.zzbo.zza(Unknown Source)
at com.google.android.gms.internal.zzbbl.setResult(Unknown Source)
at com.google.android.gms.internal.zzbbf.zzz(Unknown Source)
at com.google.android.gms.internal.zzbbf.zzf(Unknown Source)
at com.google.android.gms.internal.zzbbf.zzb(Unknown Source)
at com.google.android.gms.internal.zzbav.zza(Unknown Source:3)
at com.google.android.gms.internal.zzbdk.zzb(Unknown Source)
at com.google.android.gms.internal.zzbdk.zzrR(Unknown Source)
at com.google.android.gms.internal.zzbdk.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzaa.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzn.zzsR(Unknown Source:2)
at com.google.android.gms.common.internal.zze.zzy(Unknown Source)
at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source:4)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
Run Code Online (Sandbox Code Playgroud)
Fabric的日志报告.
我们使用firebase和gms版本是11.0.2
我们如何检查这些问题?
和gms版本11.8.0中的相同问题
java.lang.IllegalStateException: Results have already been set
at com.google.android.gms.common.internal.zzbs.zza(Unknown Source)
at com.google.android.gms.common.api.internal.zzs.setResult(Unknown Source)
at com.google.android.gms.common.api.internal.zzm.zzy(Unknown Source)
at com.google.android.gms.common.api.internal.zzm.zzf(Unknown Source)
at com.google.android.gms.common.api.internal.zzm.zzb(Unknown Source) …Run Code Online (Sandbox Code Playgroud) android illegalstateexception uncaughtexceptionhandler google-play-services
@Override
@Async
public void asyncExceptionTest() {
int i=1/0;
}
Run Code Online (Sandbox Code Playgroud)
如何使用Spring Async框架进行日志记录而不必将try catch放在每个异步方法中?它似乎没有传递到DefaultUncaughtExceptionHandler正常.
java spring asynchronous exception-handling uncaughtexceptionhandler
在我的onCreate()中,我设置了一个UncaughtException处理程序,如下所示:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
Log.e(getMethodName(2), "uncaughtException", throwable);
android.os.Process.killProcess(android.os.Process.myPid());
}
});
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我想恢复系统向用户显示强制关闭对话框的默认行为.
如果我尝试KillProcess()用throw throwable编译器替换调用,抱怨我需要用try/catch包围它.
如果我用try/catch包围它:
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
try {
Log.e(getMethodName(2), "uncaughtException", throwable);
throw throwable;
}
catch (Exception e) {
}
finally {
}
}
});
Run Code Online (Sandbox Code Playgroud)
编译器仍然抱怨throw throwable需要用try/catch包围.
我如何重新扔掉那个扔掉的?这样,除了信息量之外,Log.e()系统的行为与以前完全一样:因为我从未设置默认的UncaughtException处理程序.
我知道Cocoa中有一个UncaughtExceptionHandler,但我正在为Swift寻找同样的东西.即,当应用程序中由于任何错误而未在本地捕获任何错误/异常时,它应该一直冒泡到顶级应用程序对象,在那里我应该能够优雅地处理它并适当地响应用户.
我最近注意到,当未捕获的异常发生时,我的应用程序不会崩溃,但它没有响应.我使用谷歌分析来获得崩溃的洞察力,我怀疑这可能是问题的原因.
当我扔进NullPointerException去onCreate()(紧接着)后super.onCreate(),该应用程序显示一个白色的屏幕,但它不会崩溃.
Logcat说:
06-30 14:00:59.386 26259-26259/? I/GAv4? Google Analytics 7.5.71 is starting up. To enable debug logging on a device run:
adb shell setprop log.tag.GAv4 DEBUG
adb logcat -s GAv4
06-30 14:00:59.398 26259-26259/? W/GAv4? AnalyticsReceiver is not registered or is disabled. Register the receiver for reliable dispatching on non-Google Play devices. See http://goo.gl/8Rd3yj for instructions.
06-30 14:00:59.409 26259-26259/? W/GAv4? CampaignTrackingReceiver is not registered, not exported or is disabled. Installation campaign tracking is not possible. …Run Code Online (Sandbox Code Playgroud) Thread.UncaughtExceptionHandler 声明当处理未捕获的异常的方法本身抛出异常时,该异常将被忽略:
void uncaughtException(Thread t,Throwable e):
当给定线程由于给定的未捕获异常而终止时调用的方法.
Java虚拟机将忽略此方法抛出的任何异常.
但是当我测试它时,JVM没有忽略未捕获的异常处理程序处理的异常:
public static void main(final String args[]) {
Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread arg0, Throwable arg1) {
throw new java.lang.RuntimeException("e2");
}
});
throw new RuntimeException("e1");
}
Run Code Online (Sandbox Code Playgroud)
Eclipse控制台输出(JRE 1.7):
异常:从线程"main"中的UncaughtExceptionHandler抛出java.lang.RuntimeException
我发现的另一个奇怪的是我得到的输出不是来自System.err.它似乎完全来自另一个流.我通过重定向System.err来验证这一点System.out,但我仍然得到"红色"输出:
public static void main(final String[] args) {
System.setErr(System.out);
System.out.println(System.err == System.out);
System.err.println("this is black color");
try {
throw new Error("test stacktrace color");
} catch (Throwable e) {
e.printStackTrace();
}
try {
Thread.sleep(2500);
} …Run Code Online (Sandbox Code Playgroud) java jvm exception-handling uncaught-exception uncaughtexceptionhandler
我正在使用此代码来处理可能导致我的应用程序崩溃的任何未捕获的异常.
public class ExceptionHandler implements java.lang.Thread.UncaughtExceptionHandler {
private final Context myContext;
public ExceptionHandler(Context context) {
myContext = context;
}
public void uncaughtException(Thread thread, Throwable exception) {
Toast.makeText(myContext,
"The application has crashed, and a report is sent to the admin",
Toast.LENGTH_SHORT).show();
StringWriter stackTrace = new StringWriter();
exception.printStackTrace(new PrintWriter(stackTrace));
System.err.println(stackTrace);// You can use LogCat too
Intent intent = new Intent(myContext, CrashActivity.class);
myContext.startActivity(intent);
Process.killProcess(Process.myPid());
System.exit(10);
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用已知但未捕获的异常(仅测试)运行它时,会调用活动"CrashActivity",但必须在它之前出现的Toast才会显示.
其实我只想显示Toast,然后调用myContext.finish(); 而不是去CrashActivity.但那种敬酒不可见.
我哪里错了?
发生了一件奇怪的事.我编写了一个Java程序,我没有采取任何措施以任何特殊方式处理未捕获的异常.但是当我在Windows 7中运行这个特定程序时,在从main调用的静态上下文中会出现这个未被捕获的异常,导致窗口弹出,显示异常.我试着写一个小程序来复制这个效果无济于事.一个程序(我完全手工编写)产生一个弹出窗口,而没有其他程序会做同样的事情.
我想特别跟踪这一点,以便我可以添加代码,使其他CAUGHT异常以类似的方式显示堆栈跟踪.
我在IRC问过这个问题,但人们告诉我这不会发生.好吧,它发生了.下面有一个截图.
我认为我唯一的希望就是如果其他人认识到这一点并且可以告诉我它来自哪里.
谢谢!

更新:抱歉延迟获取一些代码.我不得不照顾一个绞痛的婴儿.请注意,这是一个桌面Java应用程序.它不是applet,也不使用webstart.
这是从获取对话框的程序中复制和粘贴的代码.我会做另一个编辑,让你知道我的同事(获得例外)是否得到了这个案例的对话框.我一直小心翼翼地包括导致异常的一切.只缺少IPAddress类实现,但是它没有参与异常,因为直到异常发生后才实际使用它.请注意发生异常的行之前的星号.该行代码对应于您在屏幕截图中可以看到的异常.
package staticexception;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import javax.swing.UIManager;
public class StaticException {
// Don't need this fully implemented.
public static class IPAddress {
public static IPAddress getBroadcast(IPAddress mask, IPAddress myip) {
return new IPAddress();
}
public IPAddress() {}
public IPAddress(int maskval) {}
public IPAddress(byte[] addr) {}
public IPAddress mask(IPAddress netmask) {
return this;
}
public int prefixLength() {
return 0;
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个运行一系列任务的Java库.我使用以下方法注册了默认的未捕获异常处理程序
Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());
UncaughtExceptionHandler实现UncaughtExceptionHandler并仅记录错误信息STDERR.
我的Java库是通过JNI从C++代码调用的,JNI正在调用它,ExceptionCheck()并在C++中将错误记录为FATAL.
问题是:
在运行时,当RuntimeException我的Java代码中发生(或任何其他未捕获的异常)时,错误是在C++中捕获的,而不是我JavaUncaughtExceptionHandler注册为线程默认的未捕获异常处理程序.
DefaultUncaughtExceptionHandler真正得到了叫什么?我知道在线程关闭之前,但具体在JNI情况下.是在返回C++之前还是在C++代码完成之后调用的.我认为这与JNI中的线程管理有关,请分享任何相关信息.try/ catch块之外的其他替代方法)非常感谢.
c++ java java-native-interface multithreading uncaughtexceptionhandler