Обработка исключений в каждом методе, вместо этого, выбрасывая и WrappedResult в качестве типа возврата - PullRequest
0 голосов
/ 27 декабря 2018

Недавно я начал создавать новое приложение, это MVC и Webapi-приложения на основе .Net Core.

Один из моих старших руководителей придумал идею WrappedResult в качестве возвращаемого типа для каждого метода.так что нам не нужно бросать исключения.Ниже приведена структура

public class WrappedResult<T>
{
    public T Result { get; set; }
    public bool IsSuccess
    {
        get
        {
            return !string.IsNullOrWhiteSpace(SuccessMessage);
        }
    }
    public string SuccessMessage { get; set; }
    public bool HasError
    {
        get
        {
            return Errors.Count > 0;
        }
    }

    public List<RectoError> Errors { get; set; } = new List<RectoError>();

    public void AddError(ErrorCode errorCode = ErrorCode.None, string errorMessage = null)
    {
        var rectoError = new RectoError()
        {
            ErrorCode = errorCode,
            ErrorMessage = errorMessage,                
        };
        Errors.Add(rectoError);
    }

    public void AddError(RectoError rectoError)
    {
        Errors.Add(rectoError);
    }

    public Task<WrappedResult<T>> ToTask()
    {
        return Task.Factory.StartNew(() => {
            return this;
        });
    }
}

public class RectoError
{        
    public ErrorCode ErrorCode { get; set; }
    public Exception Exception { get; set; }
    public string ErrorMessage { get; set; }
}

. И он предлагает использовать этот объект как тип возвращаемого значения для каждого метода всех классов, где мы должны использовать try / catch в каждом методе, а также где бы то ни быловызываются методы, которые должны проверять ответ предыдущего метода

Проверьте образец ниже,

    public async Task<WrappedResult<List<AreaUserStagingDto>>> GetAreaUsersInStaging(UserDto currentUser)
    {
        WrappedResult<List<AreaUserStagingDto>> result = new WrappedResult<List<AreaUserStagingDto>>();
        try
        {
            var query = null; //<= get output from database

            result.Result = query;
        }
        catch (Exception ex)
        {
            _dbManager.HandleDbException(ex, ref result, currentUser);
        }

        return result;
    }

У меня есть следующие проблемы с этим способом обработки исключений.

  • Бесполезно, что мы будем использовать блок try / catch в базе кода, в то время как мы должны обрабатывать исключения только в точке входа или там, где нам нужно сделать что-то еще в случае исключения.
  • Для каждого метода потребуются дополнительные строки кода.Программе нужно проверять ошибки каждый раз, даже если нет исключений в 99,9% времени.

Я думаю, что при таком подходе может быть больше недостатков,

Кто-нибудь видит какие-либоПреимущество этого способа обработки исключений и возврата WrappedResult.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...