【发布时间】:2015-10-26 19:32:59
【问题描述】:
我正在通过其 API 为另一款软件编写插件。 API返回的类只能通过原生软件和API访问。因此,我正在编写自己的独立 POCO/DTO 对象,这些对象映射到 API 类。我正在开发一项功能,该功能将读取本机文件,并返回这些 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
}
}
我使用测试文件设置了单元测试,但是在对其他文件运行导出时,我一直遇到意外问题。有时原生对象会有意想不到的值,或者 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;}
}
这通常是如何处理的?是否有其他选项可以报告错误以及我没有考虑的返回值?
【问题讨论】:
-
取决于实现,Martin Fowler 认为最后一个选项最有效。还有 Exception 方式,当出现问题时抛出异常。
-
您是否碰巧有一个链接指向 Martin 谈到此问题的博客文章或演示文稿?
-
你也可以做回调(委托/lambda)或事件。
标签: c# design-patterns exception-handling error-logging