`
cywhoyi
  • 浏览: 423473 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

异常处理

阅读更多

首先提倡下Hibernate的验证器,功能强大且使用方面,Hibernate Validator提供包括国际化,传统的字符空,非法的输入等,而且给了很友善的message信息。

public class BeanValidators {

	/**
	 * 调用JSR303的validate方法, 验证失败时抛出ConstraintViolationException, 而不是返回constraintViolations.
	 */
	public static void validateWithException(Validator validator, Object object, Class<?>... groups)
			throws ConstraintViolationException {
		Set constraintViolations = validator.validate(object, groups);
		if (!constraintViolations.isEmpty()) {
			throw new ConstraintViolationException(constraintViolations);
		}
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>中为List<message>.
	 */
	public static List<String> extractMessage(ConstraintViolationException e) {
		return extractMessage(e.getConstraintViolations());
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为List<message>
	 */
	public static List<String> extractMessage(Set<? extends ConstraintViolation> constraintViolations) {
		List<String> errorMessages = new ArrayList<String>();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.add(violation.getMessage());
		}
		return errorMessages;
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为Map<property, message>.
	 */
	public static Map<String, String> extractPropertyAndMessage(ConstraintViolationException e) {
		return extractPropertyAndMessage(e.getConstraintViolations());
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为Map<property, message>.
	 */
	public static Map<String, String> extractPropertyAndMessage(Set<? extends ConstraintViolation> constraintViolations) {
		Map<String, String> errorMessages = new HashMap<String, String>();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.put(violation.getPropertyPath().toString(), violation.getMessage());
		}
		return errorMessages;
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e) {
		return extractPropertyAndMessageAsList(e.getConstraintViolations(), " ");
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolations>为List<propertyPath message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations) {
		return extractPropertyAndMessageAsList(constraintViolations, " ");
	}

	/**
	 * 辅助方法, 转换ConstraintViolationException中的Set<ConstraintViolations>为List<propertyPath + separator + message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(ConstraintViolationException e, String separator) {
		return extractPropertyAndMessageAsList(e.getConstraintViolations(), separator);
	}

	/**
	 * 辅助方法, 转换Set<ConstraintViolation>为List<propertyPath + separator + message>.
	 */
	public static List<String> extractPropertyAndMessageAsList(Set<? extends ConstraintViolation> constraintViolations,
			String separator) {
		List<String> errorMessages = new ArrayList<String>();
		for (ConstraintViolation violation : constraintViolations) {
			errorMessages.add(violation.getPropertyPath() + separator + violation.getMessage());
		}
		return errorMessages;
	}
}

 
HibernateValidator

结合HibernateValidator,添加自定义的exception

 

public class CustormizeException extends RuntimeException {

    private static final long serialVersionUID = -3703423976960486177L;

    private int errorCode;

    public CustormizeException(ResultCode statusCode) {
        this(statusCode, null);
    }

    public CustormizeException(ResultCode resultCode, String message) {
        super(resultCode.name() + (message == null ? "" : " " + message));
        this.errorCode = resultCode.code();
    }

    public String toString() {
        return String.format("{\"errorCode\":\"%s\",\"errorMsg\":\"%s\"}", errorCode, this.getMessage());
    }

    public int getErrorCode() {
        return errorCode;
    }

    public boolean checkStatus(ResultCode resultCode) {
        return errorCode == resultCode.code();
    }

}

 增加异常处理的切面处理器,能够很快的捕获信息,反馈给各个终端设备,而不至于抛出恶心的代码异常信息。

@ControllerAdvice
public class CustormizeExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = {CustormizeException.class})
    public final ResponseEntity<?> handleException(CustormizeException exception, WebRequest request) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("text/plain; charset=UTF-8"));
        return handleExceptionInternal(exception,
                exception.getCode() + ":" + exception.getMessage(),
                headers,
                exception.status,
                request);
    }

    @ExceptionHandler(value = {ConstraintViolationException.class})
    public final ResponseEntity<?> handleException(ConstraintViolationException exception, WebRequest request) {
        Map<String, String> errors = BeanValidators.extractPropertyAndMessage(exception.getConstraintViolations());
        String errorBody = JSON.toJSONString(errors, true);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("text/plain; charset=UTF-8"));
        return handleExceptionInternal(exception,
                errorBody,
                headers,
                HttpStatus.BAD_REQUEST,
                request);
    }


}

 总结:

异常处理其实不会让你头疼,但是我们常常忽略把异常丢给用户,这种事情成妾做不到,只能通过切面的方式在方法后捕获,然后进行反馈。

1
2
分享到:
评论

相关推荐

    C#异常处理详解

    C# 异常处理详解 C# 异常处理是指在 C# 程序中处理和捕捉异常的机制。异常处理是指程序在执行过程中出现错误或异常时,程序如何处理和恢复的机制。C# 异常处理机制基于面向对象的设计思想,使用继承和多态来处理...

    java异常处理的简单练习

    Java异常处理是编程中至关重要的一个环节,它用于在程序执行过程中处理错误和不寻常的情况。在Java中,异常处理通过使用try-catch-finally语句块和异常类来进行。以下是对给定代码的详细解释: 1. **异常类的继承**...

    Java异常处理机制

    java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字。  try 关键字后紧跟一个花括号括起来的代码块,简称try块。同理:下面的也被称为相应的块。  它里面可置引发异常的代码。catch后...

    微服务下全局异常处理方案

    在微服务架构中,由于服务间的解耦和分布式特性,异常处理显得尤为重要。全局异常处理方案旨在确保系统在出现异常时能提供一致的反馈,同时避免异常传播导致服务崩溃。以下是一个具体的微服务下全局异常处理方案: ...

    java异常处理

    Java异常处理是编程中至关重要的一个环节,它允许程序员优雅地处理程序运行过程中可能出现的错误情况,确保程序的稳定性和健壮性。异常处理机制在Java中被设计为一种结构化的方法,使得程序在遇到不可预见的问题时,...

    JSP 异常处理

    JSP 异常处理 当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方。JSP代码中通常有以下几类异常: 检查型异常:检查型异常就是一个典型的用户错误或者一个程序员无法预见的错误。举例...

    Java异常处理学习心得

    Java 异常处理学习心得 Java 异常处理是 Java 编程语言中的一个重要概念,它允许开发者捕获和处理程序中的异常,从而确保程序的可靠性和稳定性。在 Java 中,异常处理机制可以分为两种:可控式异常和运行时异常。 ...

    Java异常处理实例分析

    Java异常处理是编程中至关重要的一个环节,它帮助开发者优雅地处理程序运行时可能出现的问题,保证程序的稳定性和健壮性。在Java中,异常处理通过`try-catch-finally`结构来实现,同时还可以使用`throw`关键字来声明...

    Java异常处理.md

    Java异常处理机制是一种用于有效管理程序运行时错误的方法。在Java中,通过try、catch和finally语句来实现异常捕获与处理: 1. **基础异常捕获**: - 当代码执行过程中出现如除数为零的`ArithmeticException`等...

    MySQL定义异常和异常处理详解

    MySQL中的异常处理是数据库编程中不可或缺的一部分,它允许开发者预设对可能出现的错误或异常的响应,从而确保程序的稳定性和健壮性。在MySQL中,异常定义和处理主要是通过`DECLARE`语句来实现的。 1. **异常定义**...

    Java异常处理

    简介:异常处理是java语言的重要特性之一,《Three Rules for effective Exception Handling》一文中是这么解释的:它主要帮助我们在debug的过程中解决下面的三个问题。  什么出错了  哪里出错了  为什么...

    Java学习笔记之异常处理

    Java学习笔记之异常处理 Java学习笔记之异常处理是Java编程语言中的一种重要机制,用于处理程序中出现的异常情况。异常是指程序在执行过程中出现的非正常情况,例如数组下标越界、算术运算异常、空指针异常等。在...

    Java Web项目整体异常处理机制

    在Java Web开发中,异常处理是一项至关重要的任务,它确保了系统的稳定性和用户体验。当系统内部出现异常时,如果不妥善处理,可能会导致用户界面显示不友好甚至泄露敏感信息。本文将探讨一种整体的异常处理机制,以...

    轻松学习C#的异常处理

    在C#编程中,异常处理是一项至关重要的技能,它允许开发者优雅地处理程序运行时可能出现的错误情况,防止程序突然崩溃。本文将深入探讨C#的异常处理机制,特别是`try...catch`、`try...finally`以及`try...catch......

    易语言HOOK异常处理

    "New_SE_Handler"可能是一个新的结构化异常处理程序,结构化异常处理(SEH)是Windows操作系统中的一个特性,用于处理硬件和软件异常。 "GetSeAddr"可能是获取异常发生时的地址函数,这对于分析异常原因和定位问题...

    Java异常处理操作实例小结

    Java 异常处理操作实例小结 Java 异常处理是 Java 编程语言中的一种错误处理机制,用于捕获和处理运行时的异常情况。本文将通过实例形式总结分析 Java 异常处理操作的常见情况与相关处理技巧。 一、异常处理的使用...

    java异常处理.ppt

    Java 异常处理 Java 异常处理是 Java 编程语言中的一种错误处理机制,它允许程序员捕获和处理运行时的异常情况。下面是 Java 异常处理的详细知识点: 1. 异常的概念 异常是指在程序的运行过程中所发生的不正常的...

    通用异常处理

    在IT行业中,异常处理是一项至关重要的技能,尤其是在编写复杂、多层逻辑的程序时。"通用异常处理"指的是设计一种可以捕获并处理各种类型异常的机制,这种机制旨在提高程序的健壮性和稳定性,避免因为未预见的错误...

Global site tag (gtag.js) - Google Analytics