c# - DAO 的类级错误处理程序
问题描述
我正在使用实体框架。下面是我的 ActorsDao 类中 Actors 上下文的列表方法示例。如果您想象我的应用程序类似于 imdb,那么将有针对各种其他上下文(如电影、导演、流派、评论、工作室等)的 CRUD 方法。
无论方法或上下文如何,我都以相同的方式处理错误。由于我在许多上下文中使用了许多方法,因此我的 catch 部分始终完全相同。
显然,我可以创建一个错误处理类,将代码放在那里,然后从 catch 块中调用该类中的一个方法。
但是,我想知道是否有办法从每个方法中省略 TRY...CATCH 并为我的实体框架层中的方法设置全局错误处理程序?
我只希望这个全局错误处理程序处理这些错误,而不是来自应用程序其余部分的错误。
我似乎记得在 Java Spring 中,您可以使用方法名称注释类或方法,并且所有错误都将传递给它,而无需 TRY...CATCH。我想知道.NET(或具有此类功能的第三方库)是否有类似的东西?
public List<Actor> ListActors()
{
List<Actor> actorList = new List<Actor>();
using (var context = new ActorContext())
{
try
{
actorList = context.Actors.ToList<Actor>();
}
catch (Exception e)
{
//Handle error code
}
}
return actorList;
}
编辑
我做了更多的研究,并从这里找到了这段代码https://stackoverflow.com/a/4851985/1753877
private void GlobalTryCatch(Action action)
{
try
{
action.Invoke();
}
catch (ExpectedException1 e)
{
throw MyCustomException("Something bad happened", e);
}
catch (ExpectedException2 e)
{
throw MyCustomException("Something really bad happened", e);
}
}
public void DoSomething()
{
GlobalTryCatch(() =>
{
// Method code goes here
});
}
使用这样的代表可以吗?它当然符合我的要求。
解决方案
您可以像这样创建一个类并从该类扩展控制器。
错误处理程序类如下所示:
package com.wes.essex.rest;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.wes.essex.bean.ErrorResponse;
public class SkyNewsController {
private static final Logger LOGGER = LoggerFactory.getLogger(SkyNewsController.class);
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleError(Exception ex) {
LOGGER.info("start");
LOGGER.error(ex.getMessage(), ex);
ErrorResponse error = new ErrorResponse();
error.setTimestamp(ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT));
LOGGER.debug("error : {} ", error);
ResponseEntity<ErrorResponse> response = null;
if (ex instanceof ConstraintViolationException) {
error.setReasonCode(HttpStatus.BAD_REQUEST.value());
ConstraintViolationException constraintException = (ConstraintViolationException) ex;
Set<ConstraintViolation<?>> set = constraintException.getConstraintViolations();
String errorMessage = "Input Validation Failed:";
for (ConstraintViolation<?> constraintViolation : set) {
errorMessage += constraintViolation.getMessageTemplate() + ",";
}
errorMessage = errorMessage.substring(0, errorMessage.length() - 1);
error.setErrorMessage(errorMessage);
response = new ResponseEntity<ErrorResponse>(error, HttpStatus.BAD_REQUEST);
} else {
error.setReasonCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
error.setErrorMessage(ex.getMessage());
response = new ResponseEntity<ErrorResponse>(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
return response;
}
}
这将是错误响应的 baean 类:
package com.wes.essex.bean;
public class ErrorResponse {
private static final long serialVersionUID = 5776681206288518465L;
private String timestamp;
private String errorMessage;
private int reasonCode;
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
public int getReasonCode() {
return reasonCode;
}
public void setReasonCode(int reasonCode) {
this.reasonCode = reasonCode;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}
推荐阅读
- json - angular.json 资产:使用通配符作为名称
- c - 如何shell命令注入文件
- node.js - 在某些情况下,将 nodejs 缓冲区转换为字符串并返回到缓冲区会产生不同的结果
- typescript - 在 Typescript 中指定具有至少一个已知属性的对象
- javascript - 点击事件冒泡到父级后输入按钮消失
- python - 尝试将多个参数设置为while循环Python
- c++ - 对于 C++ 中的嵌套类,如何访问封闭类的私有成员?
- ios - SwiftUI Gradient 在模拟器上渲染不正确的颜色
- r - 将函数应用于 r 中的每个组以创建多个数据帧并将它们全部组合到 r
- java - MongoDB 连接可以类似于 Java servlet 中的 SQL 连接吗?