`

线程运行中抛出异常的处理

    博客分类:
  • Java
阅读更多

    最近项目里一个发送短消息的线程老是死掉,初步怀疑是由于网络原因。又不想弄个线程监视之类的,搜了一下 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);

分享到:
评论

相关推荐

    delphi线程异常处理

    // 这里编写线程执行的代码,可能抛出异常 except on E: Exception do // 在这里处理异常,例如记录错误日志 ShowMessage('线程发生异常: ' + E.Message); end; finally // 在finally块中,你可以清理资源,...

    C++ 异常类 抛出与捕获异常

    `try` 块用来包含可能抛出异常的代码,`catch` 块用于捕获并处理这些异常,而 `throw` 语句则用于在程序中引发异常。 `throw` 语句可以用于任何类型的数据,但通常我们使用预先定义的异常类来提高可读性和代码的...

    java 多线程异常处理

    当在`try`块中抛出异常时,`catch`块会捕获并处理这个异常。在这个例子中,`Thread.sleep()`可能会抛出`InterruptedException`,所以我们需要捕获并处理它。如果没有捕获,程序将会因未捕获的异常而中断。 实验题2...

    易语言线程结构异常处理

    线程结构异常处理源码是易语言中处理这些异常的关键部分。当线程在执行过程中遇到问题,比如试图读取或写入无效的内存地址(SE保护内存读写异常),或者进行除以零的操作时,程序会触发一个异常。这种情况下,程序员...

    易语言线程结构异常处理.7z

    在易语言中,可以使用“捕获异常”和“抛出异常”语句来实现异常处理。当发生异常时,程序会跳出当前执行路径,进入异常处理块。如果异常没有被处理,程序将终止。同时,易语言还支持自定义异常类型,允许开发者根据...

    多线程异常处理.pdf

    在处理多线程异常时,需要考虑线程池的使用情况,由于线程池通常会重用线程,对于抛出异常的线程,需要有机制来处理,例如在Java的ExecutorService线程池中可以为每个任务指定一个Callable,它允许返回一个结果并抛...

    深入理解java异常(异常中的Error+异常中的Exception+检查异常+运行时异常+异常处理+throws关键字等)

    throws 关键字用于在方法签名中声明可能抛出的异常类型,当方法不知道如何处理异常时,可以使用 throws 将异常抛出给调用者处理或者交给 JVM。 在 Java 中,Exception 类提供了一组方法用来获取异常的一些信息,...

    WPF全局异常捕获Demo,防止程序运行过程中出现异常崩溃

    本示例"**WPF全局异常捕获Demo**"旨在提供一种策略,确保在程序运行过程中能够有效地捕获和处理异常,从而防止程序因错误而意外终止。 首先,我们要理解WPF应用程序的生命周期,以及在何处设置全局异常处理。WPF...

    异常处理和多线程

    在Java编程中,异常处理是一种机制,用于在程序运行过程中处理可能出现的错误情况。异常是在程序执行期间遇到的不正常条件,可能导致程序的终止。Java中的异常分为两大类:错误(Error)和违例(Exception)。 1. ...

    一个基于C#实现的完美解决在多线程中异常处理的程序代码

    3. **线程池中的异常处理**:使用`ThreadPool`时,线程池线程的异常默认不会向上抛出,而是导致线程终止。为了解决这个问题,可以创建一个代理方法,该方法包含`try-catch`块,并在捕获异常后进行适当处理。 4. **`...

    向指定线程插入异常,以便控制线程行为

    这种控制方法通过向线程抛出异常来实现,允许在不修改原有线程代码的情况下改变其行为。 1. **线程句柄**:`HANDLE hThread` 是线程的标识符,用于后续操作线程。通过这个句柄,我们可以暂停、恢复线程,甚至向线程...

    让vc6支持new 抛出异常

    在VC6中,`new`失败只会返回`NULL`,而不是抛出异常,这可能导致难以调试的问题,尤其是当程序依赖于异常处理机制来捕获内存分配失败的情况。 要使VC6支持`new`失败时抛出异常,我们需要手动实现这个功能。一种方法...

    jni方法里面抛出异常

    2. **异常处理**:在Java中,异常处理是通过try-catch-finally语句块实现的,而在C/C++中,错误通常通过返回错误码或抛出异常来表示。JNI中,Java的异常机制无法直接应用于本地代码,因此需要特殊处理。 3. **JNI中...

    运行时异常与一般异常的区别?

    抛出之后,如果是线程,这个线程就会退出,如果主程序抛出异常,那么这个程序就退出。 需要注意的是,运行时异常是 Exception 的子类,同样也有一般异常的特点,是可以被 catch 块处理的。只是我们不对它进行处理...

    Java 实例 - 多线程异常处理源代码-详细教程.zip

    当线程池中的工作线程抛出未捕获异常时,`ThreadPoolExecutor`默认会停止工作线程。可以通过`RejectedExecutionHandler`处理拒绝的任务,或自定义`ThreadFactory`来控制线程的异常行为。 六、源代码实例 教程中的源...

    Java语言与面向对象程序设计第16讲(异常处理,多线程和流式输入输出与文件处理)

    在try块中,编写可能会抛出异常的代码。如果出现异常,控制权将转移到匹配的catch块中。catch块用于捕获并处理特定类型的异常。finally块是可选的,无论是否发生异常,它的代码都将被执行,通常用于释放资源。throw...

    JCVM异常处理机制

    值得注意的是,为了节省内存资源,Java卡平台允许直接调用JCVM内部异常类的静态方法`throwIt()`来抛出异常。另外,虽然`Throwable`类的直接子类不包括`Error`,但JCVM必须支持所有Java平台中的`Error`类(除了`...

    dotnet C# 应用程序进程创建太多线程将会抛出 OutOfMemoryException 异常.rar

    在.NET框架中,C#应用程序在执行过程中可能会遇到各种异常情况,其中之一是`OutOfMemoryException`。这个异常通常表示程序尝试分配的内存超过了系统能够提供的内存。然而,一个常见的误解是,`OutOfMemoryException`...

    C#异常处理总结及简单实例

    异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。 因此处理这种错误,就称为异常处理。 二、异常处理如何操作? C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw...

    多线程与异常处理(共71张PPT)精选.pptx

    try块包含可能抛出异常的代码,catch块捕获并处理异常,finally块确保无论是否发生异常都会执行的代码。 5. **自定义异常**: - 开发者可以通过继承`Exception`类或其子类创建自定义异常,以便更好地封装和处理...

Global site tag (gtag.js) - Google Analytics