我正在为一家公司编写另一个ActiveRecord实现,该公司对我的代码不那么害怕,而不是在CastleProject的实现上命名为“Release Candidate”。无论如何,我在基类的每个属性上使用Attributes将它们映射到返回的DataSet列:
[ResultColumnAttribute("CUST_FIRST_NAME")]
public string FirstName
{
get { return _columnName; }
set { _columnName = value; }
}
这样当我从DataSet实例化该类时,我将该属性值赋值为该列的值。当列与属性映射但未显示在DataSet中时,我应该抛出什么异常?我不想去写一个自定义的(懒惰的),我认为Application.Exception有点不起眼。
答案 0 :(得分:8)
此异常已本地化到您的域名,因此我认为您最好自己编写InvalidMappingException
。
以下是我的写作方式:
[Serializable]
public class InvalidMappingException : Exception
{
public InvalidMappingException() { }
public InvalidMappingException(String message)
: base(message) { }
public InvalidMappingException
(String message, Exception innerException)
: base(message, innerException) { }
protected InvalidMappingException
(SerializationInfo info, StreamingContext context)
: base(info, context) { }
}
答案 1 :(得分:2)
我认为没有理由不使用InvalidOperationException
。请记住,除非您的调用者会对您的异常执行某些编程操作,否则异常类型无关紧要。例如,如果他们要明确地捕获它,或引用您的异常的某些属性,那么您需要自己的属性。
否则,内置异常会很好。
How to Design Exception Hierarchies的合着者Krzysztof Cwalina见Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries。
答案 2 :(得分:1)
我会编写一个特定于您的实现的自定义异常。这是一个非常具体的自定义情况,自定义异常可能比其他任何东西都更合适。
对我而言,在这种情况下,(lazy)
不足以避免在保证时添加自定义异常所需的一小部分代码......
答案 3 :(得分:1)
由于“抛出新的异常”现在是正式的坏样式并且时尚,我为所有错误抛出InvalidOperationException(“描述性消息”)我懒得为自己编写自定义错误。
答案 4 :(得分:0)
首先,Castle Windsor现在正式版本2,没有发布候选人:)
我认为.NET框架中只有一组有限的异常,你可以从代码中抛出:
答案 5 :(得分:0)
同意你应该自己编写(哎呀,只需键入异常并按Tab键,编辑器就可以完成2/3的工作!),但如果没有,我可能会选择ArgumentException