如果使用无效泛型类型,应该抛出异常吗?如果是,是哪一个?

本文关键字:如果 哪一个 抛出异常 无效 泛型类型 | 更新日期: 2023-09-27 18:17:54

我正在构建一个简单的自定义轻量级csv生成器类,奇怪的是,命名为CsvWriter<T> .

这个类的工作方式是,它将自动生成一个csv到底层的Stream从所有的公共属性被标记为预定义的属性,我们恰当地命名为CsvPropertyAttribute

在创建对象时,我想检查泛型类型是否使用预定义的CsvPropertyAttribute实现了至少一个公共属性。如果不是这种情况,我想抛出一个异常,因为泛型类型参数不是真正有效的。

出现的问题如下:

  1. 是否可以在构造函数中抛出异常?如果不是,解决方案很简单:我可以将有效属性的搜索推迟到第一次调用WriteLine(T record)或类似的方法(延迟初始化)。
  2. 是否可以抛出由泛型类型参数引起的异常?还是将生成的csv留空更好?我无法将泛型参数约束为有效类型。
  3. 最后,如果第二个问题的答案是肯定的,我应该使用什么例外?ArgumentException似乎更合适,但它仍然不完全正确。

谢谢。

如果使用无效泛型类型,应该抛出异常吗?如果是,是哪一个?

甚至可以从类构造函数抛出异常(也称为静态构造函数)。这样,您可以只对每个T执行一次检查/初始化。

如果CsvWriter<Foo>的类构造函数失败,您甚至无法调用CsvWriter<Foo>的构造函数。

如果您担心正确的参数类型,您可以创建一个自定义异常类型。这是最干净的溶液。但是我不会太担心它,因为如果你使用类构造函数,你的异常将被包装在TypeInitializationException中。

这确实应该是一个编译时错误,但是语言不支持。

1:是的,继续并抛出构造函数。这种快速失败技术将降低您发布错误代码的可能性。

2:尽快扔。不要创建文件。

3:我将创建InvalidOperationException的子类。你可以想出更好的办法。

而且,我强烈建议不仅为这个类编写单元测试,而且为任何实例化它的其他代码编写单元测试。

您可能还需要重新考虑您的设计。也许有一个界面可以给你基本的东西。