如果使用无效泛型类型,应该抛出异常吗?如果是,是哪一个?
本文关键字:如果 哪一个 抛出异常 无效 泛型类型 | 更新日期: 2023-09-27 18:17:54
我正在构建一个简单的自定义轻量级csv生成器类,奇怪的是,命名为CsvWriter<T>
.
这个类的工作方式是,它将自动生成一个csv到底层的Stream
从所有的公共属性被标记为预定义的属性,我们恰当地命名为CsvPropertyAttribute
。
在创建对象时,我想检查泛型类型是否使用预定义的CsvPropertyAttribute
实现了至少一个公共属性。如果不是这种情况,我想抛出一个异常,因为泛型类型参数不是真正有效的。
出现的问题如下:
- 是否可以在构造函数中抛出异常?如果不是,解决方案很简单:我可以将有效属性的搜索推迟到第一次调用
WriteLine(T record)
或类似的方法(延迟初始化)。 - 是否可以抛出由泛型类型参数引起的异常?还是将生成的
csv
留空更好?我无法将泛型参数约束为有效类型。 - 最后,如果第二个问题的答案是肯定的,我应该使用什么例外?
ArgumentException
似乎更合适,但它仍然不完全正确。
谢谢。
甚至可以从类构造函数抛出异常(也称为静态构造函数)。这样,您可以只对每个T
执行一次检查/初始化。
如果CsvWriter<Foo>
的类构造函数失败,您甚至无法调用CsvWriter<Foo>
的构造函数。
如果您担心正确的参数类型,您可以创建一个自定义异常类型。这是最干净的溶液。但是我不会太担心它,因为如果你使用类构造函数,你的异常将被包装在TypeInitializationException
中。
这确实应该是一个编译时错误,但是语言不支持。
1:是的,继续并抛出构造函数。这种快速失败技术将降低您发布错误代码的可能性。
2:尽快扔。不要创建文件。
3:我将创建InvalidOperationException
的子类。你可以想出更好的办法。
而且,我强烈建议不仅为这个类编写单元测试,而且为任何实例化它的其他代码编写单元测试。
您可能还需要重新考虑您的设计。也许有一个界面可以给你基本的东西。