用自定义的异常类接管未知的异常类抛出

在实际开发中,我们常常遇到捕获异常的事情。捕获一个已知的异常好过捕获一个未知的异常,因为有些异常的信息我们是可以通过业务需要进行屏蔽处理的,还可以根据指定的异常进行监控处理。总之,随心所欲。。。我们想怎么样就怎么样,一切都在我们的掌控中。。。

首先,定义一个Exception的子类,实现父类的所有构造器。

/**   
 *
 * @Description: 
 * @author wuyan   
 * @date 2015年12月30日 下午1:51:28 
 */
public class MyException extends Exception {

	/**
	 * 
	 */
	public MyException() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param message
	 */
	public MyException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param cause
	 */
	public MyException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param message
	 * @param cause
	 */
	public MyException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	/**
	 * @param message
	 * @param cause
	 * @param enableSuppression
	 * @param writableStackTrace
	 */
	public MyException(String message, Throwable cause,
			boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}

}

根据业务的需要,我们会定义一个自己业务执行的接口信息,在这个接口信息中需要抛出我们自定义的异常。

所以,在这个接口的实现过程中,我们不仅要考虑业务的计算是否需要抛出异常,还要考虑由于其它因素导致的异常我们也可以很好的处理。

interface WyMessageServer{
	
	public void sendMessage(String s) throws WyMessageException;
	
}

class WyMessageServerImpl implements WyMessageServer{

	/* (non-Javadoc)
	 * @see com.aspire.bjcss.queue.WyMessageServer#sendMessage(java.lang.String)
	 */
	@Override
	public void sendMessage(String s) throws WyMessageException {
		
		try {
			String head = s.substring(0, 3);
			String body = s.substring(4, 10);
			
			if (!head.startsWith("Wy")){
				throw new WyMessageException("unknow head");
			}
		} catch (Exception e) {
			if (e instanceof WyMessageException)
				throw e ;
			else {
				WyMessageException ex = new WyMessageException(e.getClass().getName() + ":" +e.getMessage());
				ex.setStackTrace(e.getStackTrace());
			
				throw ex ;
			}
		}
		
	}
	
}


测试结果:

1. 当s=Wy0001时,方法运行正常。

2. 当s=Ay0001时,方法抛出WyMessageException

3. 当s=null时,try..catch捕获NullPointException异常,经过处理后向外抛出WyMessageException

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用VEH机制来拦截并接管MessageBox函数的异常的示例代码: ```c++ #include <Windows.h> // Vectored Exception Handler函数 LONG WINAPI VehHandler(PEXCEPTION_POINTERS pExceptionInfo) { // 判断异常类型为访问冲突异常 if (pExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) { // 恢复异常现场,使程序继续执行 pExceptionInfo->ContextRecord->Eip += 2; // 跳过引发异常的指令,使其继续执行 // 弹出自定义的消息框 MessageBox(NULL, "Exception occurred!", "Custom Exception", MB_OK | MB_ICONERROR); // 返回处理结果,终止异常处理链 return EXCEPTION_EXECUTE_HANDLER; } // 返回继续搜索异常处理链 return EXCEPTION_CONTINUE_SEARCH; } int main() { // 注册Vectored Exception Handler PVOID pHandler = AddVectoredExceptionHandler(1, VehHandler); if (pHandler == NULL) { // 处理注册失败情况 // ... return 1; } // 触发访问冲突异常 int* p = nullptr; *p = 42; // 移除Vectored Exception Handler RemoveVectoredExceptionHandler(pHandler); return 0; } ``` 在上述代码中,我们定义了一个VEH处理函数`VehHandler`,它会在异常发生时被调用。在`VehHandler`中,我们首先判断异常类型是否为访问冲突异常EXCEPTION_ACCESS_VIOLATION),如果是,则进行自定义异常处理逻辑。在本例中,我们跳过引发异常的指令(使程序继续执行),然后弹出一个自定义的消息框来通知异常发生。最后,我们返回`EXCEPTION_EXECUTE_HANDLER`来终止异常处理链。 在`main`函数中,我们首先注册VEH处理函数,然后触发一个访问冲突异常(通过对空指针进行解引用)。当异常发生时,VEH处理函数将被调用,执行我们定义的异常处理逻辑。最后,我们移除VEH处理函数并结束程序。 请注意,上述代码只是一个简单示例,实际使用VEH机制需要根据具体需求进行详细的异常处理和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值