最近项目里一个发送短消息的线程老是死掉,初步怀疑是由于网络原因。又不想弄个线程监视之类的,搜了一下 UncaughtExceptionHandler 刚好可以解决。
线程运行时抛出的运行时异常使用try catch 是无法捕捉到的,此时往往导致线程停止正常工作。
一、首先要写一个线程异常抛出后处理类,实现UncaughtExceptionHandler 接口,我的做法是发送一封系统内部邮件给管理员:
/**
* 线程执行错误后,发送一份内部邮件给管理员,要求线程在创建之后必须设置 setUncaughtExceptionHandler
* @author HAIQING
*
*/
public class SmsSendExceptionHandler implements UncaughtExceptionHandler {
private static final Logger log = Logger.getLogger(SmsSendExceptionHandler.class);
public void uncaughtException(Thread t, Throwable e) {
String threadname=t.getClass().getName();//获得线程名
String subject="线程:"+t.getName()+"抛出异常,请检查";
StringWriter sw=new StringWriter();
PrintWriter pw=new PrintWriter(sw);
e.printStackTrace(pw);
String msg=sw.toString();//拿到线程报错的详细信息
String body="线程状态:"+t.getState()+"。类路径:"+t.getClass().getName()+"。异常详细信息:"+sw.toString();
log.error(sw.toString());
//以下代码是使用 反射机制 重新创建线程
// try {
// Class tempclass=Class.forName(t.getClass().getName());
// t=(Thread)tempclass.newInstance();
// SmsSendExceptionHandler smsHandler=new SmsSendExceptionHandler();
// t.setUncaughtExceptionHandler(smsHandler);
// t.start();
// log.info(threadname+"。重新创建实例并执行!");
// } catch (ClassNotFoundException e1) {
// e1.printStackTrace();
// log.error("线程类路径:"+threadname+"未发现", e1);
// } catch (InstantiationException e1) {
// e1.printStackTrace();
// log.error("线程类:"+threadname+"创建失败", e1);
// } catch (IllegalAccessException e1) {
// e1.printStackTrace();
// log.error("线程类:"+threadname+"创建失败", e1);
// }
}
}
二、线程创建时,设置一下:
SmsSendExceptionHandler smsHandler=new SmsSendExceptionHandler();
SmsServiceThread smsSendThread = new SmsServiceThread();
smsSendThread.setUncaughtExceptionHandler(smsHandler);
smsSendThread.start();
原线程不需更改,这样当线程执行中,抛出运行时异常后便可以到 SmsSendExceptionHandler 中 执行 uncaughtException 方法。此时可得到 该线程信息和异常信息(Thread t, Throwable e);
分享到:
相关推荐
// 这里编写线程执行的代码,可能抛出异常 except on E: Exception do // 在这里处理异常,例如记录错误日志 ShowMessage('线程发生异常: ' + E.Message); end; finally // 在finally块中,你可以清理资源,...
`try` 块用来包含可能抛出异常的代码,`catch` 块用于捕获并处理这些异常,而 `throw` 语句则用于在程序中引发异常。 `throw` 语句可以用于任何类型的数据,但通常我们使用预先定义的异常类来提高可读性和代码的...
当在`try`块中抛出异常时,`catch`块会捕获并处理这个异常。在这个例子中,`Thread.sleep()`可能会抛出`InterruptedException`,所以我们需要捕获并处理它。如果没有捕获,程序将会因未捕获的异常而中断。 实验题2...
线程结构异常处理源码是易语言中处理这些异常的关键部分。当线程在执行过程中遇到问题,比如试图读取或写入无效的内存地址(SE保护内存读写异常),或者进行除以零的操作时,程序会触发一个异常。这种情况下,程序员...
在易语言中,可以使用“捕获异常”和“抛出异常”语句来实现异常处理。当发生异常时,程序会跳出当前执行路径,进入异常处理块。如果异常没有被处理,程序将终止。同时,易语言还支持自定义异常类型,允许开发者根据...
在处理多线程异常时,需要考虑线程池的使用情况,由于线程池通常会重用线程,对于抛出异常的线程,需要有机制来处理,例如在Java的ExecutorService线程池中可以为每个任务指定一个Callable,它允许返回一个结果并抛...
throws 关键字用于在方法签名中声明可能抛出的异常类型,当方法不知道如何处理异常时,可以使用 throws 将异常抛出给调用者处理或者交给 JVM。 在 Java 中,Exception 类提供了一组方法用来获取异常的一些信息,...
本示例"**WPF全局异常捕获Demo**"旨在提供一种策略,确保在程序运行过程中能够有效地捕获和处理异常,从而防止程序因错误而意外终止。 首先,我们要理解WPF应用程序的生命周期,以及在何处设置全局异常处理。WPF...
在Java编程中,异常处理是一种机制,用于在程序运行过程中处理可能出现的错误情况。异常是在程序执行期间遇到的不正常条件,可能导致程序的终止。Java中的异常分为两大类:错误(Error)和违例(Exception)。 1. ...
3. **线程池中的异常处理**:使用`ThreadPool`时,线程池线程的异常默认不会向上抛出,而是导致线程终止。为了解决这个问题,可以创建一个代理方法,该方法包含`try-catch`块,并在捕获异常后进行适当处理。 4. **`...
这种控制方法通过向线程抛出异常来实现,允许在不修改原有线程代码的情况下改变其行为。 1. **线程句柄**:`HANDLE hThread` 是线程的标识符,用于后续操作线程。通过这个句柄,我们可以暂停、恢复线程,甚至向线程...
在VC6中,`new`失败只会返回`NULL`,而不是抛出异常,这可能导致难以调试的问题,尤其是当程序依赖于异常处理机制来捕获内存分配失败的情况。 要使VC6支持`new`失败时抛出异常,我们需要手动实现这个功能。一种方法...
2. **异常处理**:在Java中,异常处理是通过try-catch-finally语句块实现的,而在C/C++中,错误通常通过返回错误码或抛出异常来表示。JNI中,Java的异常机制无法直接应用于本地代码,因此需要特殊处理。 3. **JNI中...
抛出之后,如果是线程,这个线程就会退出,如果主程序抛出异常,那么这个程序就退出。 需要注意的是,运行时异常是 Exception 的子类,同样也有一般异常的特点,是可以被 catch 块处理的。只是我们不对它进行处理...
当线程池中的工作线程抛出未捕获异常时,`ThreadPoolExecutor`默认会停止工作线程。可以通过`RejectedExecutionHandler`处理拒绝的任务,或自定义`ThreadFactory`来控制线程的异常行为。 六、源代码实例 教程中的源...
在try块中,编写可能会抛出异常的代码。如果出现异常,控制权将转移到匹配的catch块中。catch块用于捕获并处理特定类型的异常。finally块是可选的,无论是否发生异常,它的代码都将被执行,通常用于释放资源。throw...
值得注意的是,为了节省内存资源,Java卡平台允许直接调用JCVM内部异常类的静态方法`throwIt()`来抛出异常。另外,虽然`Throwable`类的直接子类不包括`Error`,但JCVM必须支持所有Java平台中的`Error`类(除了`...
在.NET框架中,C#应用程序在执行过程中可能会遇到各种异常情况,其中之一是`OutOfMemoryException`。这个异常通常表示程序尝试分配的内存超过了系统能够提供的内存。然而,一个常见的误解是,`OutOfMemoryException`...
异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。 因此处理这种错误,就称为异常处理。 二、异常处理如何操作? C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw...
try块包含可能抛出异常的代码,catch块捕获并处理异常,finally块确保无论是否发生异常都会执行的代码。 5. **自定义异常**: - 开发者可以通过继承`Exception`类或其子类创建自定义异常,以便更好地封装和处理...