我目前正在为UnconstrainedMelody编写一些代码,它具有与枚举有关的通用方法.
现在,我有一个带有一堆方法的静态类,这些方法只能用于"flags"枚举.我不能将其添加为约束...所以它们也可能会被其他枚举类型调用.在那种情况下,我想抛出异常,但我不确定要抛出哪一个.
只是为了使这个具体,如果我有这样的事情:
// Returns a value with all bits set by any values
public static T GetBitMask<T>() where T : struct, IEnumConstraint
{
if (!IsFlags<T>()) // This method doesn't throw
{
throw new ???
}
// Normal work here
}
Run Code Online (Sandbox Code Playgroud)
投掷的最佳例外是什么?ArgumentException听起来合乎逻辑,但它是一个类型参数,而不是一个普通的参数,这很容易混淆事物.我应该介绍自己的TypeArgumentException课吗?用InvalidOperationException吗?NotSupportedException?还要别的吗?
我宁愿不为此创建我自己的例外,除非它显然是正确的事情.
我有一些代码为用户提供用户ID,然后向该用户发送电子邮件.
emailUtil.sendEmail(userId, "foo");
public void sendEmail(String userId, String message) throws MailException {
/* ... logic that could throw a MailException */
}
Run Code Online (Sandbox Code Playgroud)
MailException 可能会因为多种原因而抛出,电子邮件地址出现问题,邮件模板出现问题等.
我的问题是这样的:你是为这些异常中的每一个创建一个新的异常类型然后单独处理它们还是创建一个MailException然后将一些东西存储在允许的异常(计算机可读的东西,而不是描述文本)中我们根据实际发生的事情做不同的事情.
编辑:作为澄清,例外不是日志和什么不是,这与代码如何对它们做出反应有关.为了继续使用邮件示例,让我们说当我们发送邮件时,它可能会因为您没有电子邮件地址而失败,或者因为您没有有效的电子邮件地址,或者它可能会失败等等.
我的代码希望对每个问题做出不同的反应(主要是通过更改返回给客户端的消息,但也包括实际逻辑).
最好是针对这些问题中的每一个进行异常实现,或者是一个具有内部特征的一个伞状异常(一个枚举说),让代码区分它是什么类型的问题.
任何人都可以了解抛出自定义异常(继承自System.Exception)的优缺点,或者使用它们的正确方法?我已经知道何时/何时不抛出异常,但我正在寻找有关如何创建自己的自定义异常的指导.
我多次遇到过以下类型的代码,我想知道这是不是一个好的做法(从性能角度来看):
try
{
... // some code
}
catch (Exception ex)
{
... // Do something
throw new CustomException(ex);
}
Run Code Online (Sandbox Code Playgroud)
基本上,编码器正在做的是它们在自定义异常中包含异常并再次抛出异常.
这与以下两个方面的性能有何不同:
try
{
... // some code
}
catch (Exception ex)
{
.. // Do something
throw ex;
}
Run Code Online (Sandbox Code Playgroud)
要么
try
{
... // some code
}
catch (Exception ex)
{
.. // Do something
throw;
}
Run Code Online (Sandbox Code Playgroud)
撇开任何功能或编码最佳实践论点,这3种方法之间是否有任何性能差异?