以相同的格式处理错误和成功

我正在尝试创建一个更强大的方法,该方法根据结果返回两种不同的对象类型。


如果结果为负,则返回 CustomError 对象,但如果结果为正,则返回 Auto 对象。


下面的例子来演示。


自动服务.cs


public class AutoService {

        public async Task<object> Create(NewAuto model)

        {

            var auto = new Auto {

              Type = model.Type,

              Year = model.Year,

              // other parameters

            }

            try {

            await _autoDb.Create(auto);

            }


                catch (Exception e) {

// return this error object if something broken

                return new CustomError { Message = "It is broken" }

                }


//return the Auto entity if successful

                return auto;

            }

    }

自定义错误.cs


public class CustomError {

     public string Message {get;set;}

}

在当前格式中,当调用 Create 方法时,我需要转换结果,这会带来令人头疼的问题(例如,针对 CustomError 或 Auto 类进行转换)。


有什么建议我可以如何正确地做到这一点?


繁华开满天机
浏览 71回答 2
2回答

跃然一笑

为什么不创建一个类来表示结果,例如:class EntityResult<T> {&nbsp; &nbsp; public EntityResult(T entity) {&nbsp; &nbsp; &nbsp; &nbsp; Success = true;&nbsp; &nbsp; &nbsp; &nbsp; Entity = entity;&nbsp; &nbsp; }&nbsp; &nbsp; public EntityResult(string error) {&nbsp; &nbsp; &nbsp; &nbsp; Success = false;&nbsp; &nbsp; &nbsp; &nbsp; Error = error;&nbsp; &nbsp; }&nbsp; &nbsp; bool Success {get; }&nbsp; &nbsp; T Entity { get; }&nbsp; &nbsp; string Error { get; }}用法如下:public async Task<EntityResult<Auto>> Create(NewAuto model) {&nbsp; &nbsp; var auto = new Auto {&nbsp; &nbsp; &nbsp; &nbsp; Type = model.Type,&nbsp; &nbsp; &nbsp; &nbsp; Year = model.Year,&nbsp; &nbsp; &nbsp; &nbsp; // other parameters&nbsp; &nbsp; };&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; await _autoDb.Create(auto);&nbsp; &nbsp; &nbsp; &nbsp; return new EntityResult(auto);&nbsp; &nbsp; } catch (Exception e) {&nbsp; &nbsp; &nbsp; &nbsp; // return this error object if something broken&nbsp; &nbsp; &nbsp; &nbsp; return new EntityResult<Auto>("Error goes here");&nbsp; &nbsp; }}

开满天机

我不会使用返回类型来表示两种不同的结果,例如成功和失败。这将使代码难以理解,并且随着时间的推移,您(可能)会发现返回类型将被滥用并扩展为包含其他(不相关的?/不必要的?)信息。将 应用于Single Responsibility Principle返回类型:如果调用成功,则返回正确的对象,即Auto如果调用失败(即您捕获了异常),则创建一个自定义异常以将该失败传回调用堆栈。您的异常名称将使代码比在通用对象中包含错误更清晰。此外,如果您使用异常处理而不是具有两个目的的对象,您的调用代码将更加简洁(并且更易于维护)。把事情简单化。
打开App,查看更多内容
随时随地看视频慕课网APP