Недавно я начал создавать новое приложение, это 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.