c# - 包含错误和返回值的设计模式

标签 c# design-patterns exception-handling error-logging

我正在通过其 API 为另一款软件编写插件。 API 返回的类只能通过 native 软件和 API 访问。所以我正在编写自己的独立 POCO/DTO 对象,这些对象映射到 API 类。我正在研究一项功能,该功能将读取 native 文件,并返回我可以从其他地方窃取的这些 POCO 对象的集合。如果需要的话,目前我正在使用 JSON.NET 将这些类序列化为 JSON。

例如我可能有这样一个 DTO

public class MyPersonDTO
{
    public string Name {get; set;}
    public string Age {get; set;}
    public string Address {get; set;}       
}

..还有像这样的方法将本地“Persons”读入我的 DTO 对象

public static class MyDocReader
{
    public static IList<MyPersonDTO> GetPersons(NativeDocument doc)
    {
        //Code to read Persons from doc and return MyPersonDTOs
    }
}

我使用测试文件设置了单元测试,但是在对其他文件运行导出时,我总是遇到意想不到的问题。有时 native 对象会有意想不到的值,或者 API 中会在没有理由的情况下抛出异常。

目前,当发生“异常”的事情时,我只是记录异常并且导出失败。但我决定我宁愿导出我能导出的,并将错误记录在某处。

最简单的选择是只记录并吞下异常并返回我能返回的内容,但是这样我的调用代码就无法知道何时出现问题。

我正在考虑的一个选项是将错误字典作为单独的输出参数返回。键将标识无法读取的属性,值将包含异常/错误的详细信息。

public static class MyDocReader
{
    public static IList<MyPersonDTO> persons GetPersons(NativeDocument doc, out IDictionary<string, string> errors)
    {
        //Code to read persons from doc
    }
}

或者,我也在考虑将错误存储在返回对象本身中。这增加了我的对象的大小,但有一个额外的好处,可以将错误直接存储在我的对象中。因此,如果以后有人的导出产生错误,我不必担心在他们的计算机上追踪正确的日志文件。

public class MyPersonDTO
{
    public string Name {get; set;}
    public string Age {get; set;}
    public string Address {get; set;}

    public IDictionary<string, string> Errors {get; set;}   
}

这通常是如何处理的?是否有其他选项可以报告错误以及我没有考虑的返回值?

最佳答案

您可以将结果包装在回复或响应消息中,而不是将错误作为实体的一部分返回。然后,错误可能成为响应消息的一部分,而不是实体。

这样做的好处是实体干净

缺点是很难将错误映射回有问题的实体/属性。

当发送批量实体时,这个缺点可能是个大问题。当 API 更面向单个实体时,它就没有那么重要了。

关于c# - 包含错误和返回值的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33354083/

相关文章:

javascript - 您使用哪些 Javascript 编程模式?

python - 异常处理: Differentiating between instances of the same error in Python

oracle - 是否在Microsoft Access中拦截Oracleraise_application_error自定义消息?

c# - 不断收到错误 : redirect_uri_mismatch using youtube api v3

c# - LINQ 表达式适用于 LinqPad,但不适用于 C# Silverlight 应用程序

c# - 当你有 webforms 时如何向 asp.net 添加角色

c# - 单例代码摘录,一道面试题

design-patterns - 开发人员在编码时主要关注什么?

c# - 计算即将到来的工作日的日期时间

Python 3 异常删除封闭范围内的变量,原因不明