gpt4 book ai didi

c# - 当您不使用异常来控制流程时,代码看起来如何?

转载 作者:太空狗 更新时间:2023-10-29 18:07:12 26 4
gpt4 key购买 nike

我已经采纳了我在其他已回答问题中看到的有关何时抛出异常的建议,但现在我的 API 出现了新的问题。我没有调用包含在 try/catch block 中的方法(令人烦恼的异常),而是使用带有处理过程中可能发生的错误集合的参数参数。我理解为什么将所有内容都包装在 try/catch 中是控制应用程序流程的糟糕方法,但我很少在任何地方看到反射(reflect)这种想法的代码。

这就是为什么这整件事对我来说很奇怪。这种做法被认为是正确的编码方式,但我在任何地方都看不到它。除此之外,我不太了解在发生“不良”行为时如何与客户端代码相关联。

这是我正在研究的一些代码片段,用于保存网络应用程序用户上传的图片。不要担心细节(这很丑陋),只需看看我将这些输出参数添加到所有内容以获取错误消息的方式即可。

public void Save(UserAccount account, UserSubmittedFile file, out IList<ErrorMessage> errors)
{
PictureData pictureData = _loader.GetPictureData(file, out errors);

if(errors.Any())
{
return;
}

pictureData.For(account);

_repo.Save(pictureData);
}

这是正确的想法吗?我可以合理地预期用户提交的文件在某种程度上是无效的,所以我不应该抛出异常,但是我想知道文件出了什么问题,所以我会生成错误消息。同样,现在使用此保存方法的任何客户端也将想找出整个图片保存操作出了什么问题。

关于返回一些包含结果和附加错误消息的状态对象,我还有其他想法,但这感觉很奇怪。我知道到处都没有参数将很难维护/重构/等等。

我希望得到这方面的指导!

编辑:我认为用户提交的文件片段可能会让人们想到加载无效图像和其他“硬”错误所产生的异常。我认为这段代码片段更好地说明了我认为抛出异常的想法在哪些方面不被鼓励。

有了这个,我只是在保存一个新的用户帐户。我对用户帐户进行状态验证,然后访问持久存储以查明用户名是否已被占用。

public UserAccount Create(UserAccount account, out IList<ErrorMessage> errors)
{
errors = _modelValidator.Validate(account);

if (errors.Any())
{
return null;
}

if (_userRepo.UsernameExists(account.Username))
{
errors.Add(new ErrorMessage("Username has already been registered."));
return null;
}

account = _userRepo.CreateUserAccount(account);

return account;
}

我应该抛出某种验证异常吗?或者我应该返回错误消息吗?

最佳答案

尽管存在性能问题,但我认为允许从方法中抛出异常实际上更简洁。如果有任何异常可以在你的方法中处理,你应该适本地处理它们,否则,让它们冒泡。

在 out 参数中返回错误,或者返回状态代码感觉有点笨拙。有时面对这种情况,我会试着想象 .NET 框架将如何处理这些错误。我不相信有很多 .NET 框架方法会在 out 参数中返回错误,或返回状态代码。

关于c# - 当您不使用异常来控制流程时,代码看起来如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/919117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com