首页 > 解决方案 > 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
    });
}

使用这样的代表可以吗?它当然符合我的要求。

标签: c#.netentity-frameworkerror-handling

解决方案


您可以像这样创建一个类并从该类扩展控制器。

错误处理程序类如下所示:

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;
    }
}

推荐阅读