Обработчик ошибок уровня класса для DAO - PullRequest
0 голосов
/ 04 июля 2018

Я использую Entity Framework. Ниже приведен пример метода списка для контекста Actors в моем классе ActorsDao. Если вы представите, что мое приложение похоже на 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;

    }

EDIT

Я провел еще какое-то исследование и нашел этот код здесь 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
    });
}

Будет ли использование такого делегата в порядке? Это, безусловно, отвечает моим требованиям.

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете создать такой класс и расширить контроллер из этого класса.

Класс обработчика ошибок выглядит следующим образом:

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...