在.net中,如何让编写子类的人知道他们需要为基类可能抛出的特定异常类型进行编码?理想情况下,我希望强制开发人员在发生异常之前尝试..捕获异常或执行必要的验证...我是否可以使用属性强制开发人员编写异常代码?
例如......
我有一些调用“保存”方法的代码。在对象上调用save之前,我有一个拦截类,它提供了一些验证。如果一个类没有处于有效状态,那么我抛出一个异常(我正在看的不是我的代码,所以不使用异常在这一点上是不可接受的解决方案......),我想知道的是我如何告知消费者我的代码他们应该检查潜在的异常并为其编码或至少执行检查以便不会发生异常......?
所以简单来说(我的代码使用了很多接口等,所以这只是一个简单的例子......)
class SavableObject {
public static void Save(){
// validation
ValidationClass.BeforeSave();
// then do the save...
DoSave();
}
public static void DoSave(){
// serialize...
}
}
class ValidationClass {
public static void BeforeSave(T cls){
// perform some checks on class T
// THROW EXCEPTION if checks fail
}
}
所以在这个例子中,我的代码的使用者将从SavableObject继承如下,然后可以调用save ...例如......
class NewSavableThing: SavableObject
{
public static void Save(){
base.Save();
// calls inherited save method which may throw an exception
// At this point the exception may still occur, and the person writing this
// code may not know that the exception will occur, so the question is how do
// I make this clear or force the developer of this class to code for
// the possibility that the exception may occur?!
}
}
我想知道我是否可以使用一组属性,以便我可以强制构建子类的人来编写异常代码......例如......
class SavableObject {
[DeveloperMustCatchException(T)] // specifies that the exception type must be caught
public static void Save(){ ... }
}
class NewSaveableThing: SavableObject {
[ExceptionIgnored] / [ExceptionCaught] // specifies that the developer is aware
// that the exception needs catching/dealing with, I am assuming that
// if this attribute is not provided then the compiler will catch
// and prevent a successful compile...
public static void Save() {
}
}
任何指针都非常赞赏...
编辑:澄清 - 我想强迫开发人员承认存在异常,这样开发人员就不会对异常一无所知。理想情况下,如果[ExceptionIgnored]属性或[ExceptionHandled](或类似)属性丢失,编译器将停止编译...这将表明已考虑异常。我不介意被忽略的异常,我正在尝试做的是确保下一个开发人员知道异常的存在 - 如果这是有道理的。我知道在///注释中我可以记录异常......
我问,因为我有几个学生和我们一起工作,他们不了解异常并且没有阅读所有文档,即使已经记录了异常。我无法检查他们编写的每一行代码,所以我希望强制他们确认异常并让编译器检查我是否已经考虑了异常...他们是否选择代码是他们的选择,只要他们是意识到它的存在......
答案 0 :(得分:4)
使用XML文档(方法标题中的///
条评论),特别是exception tag:
标记允许您指定可以抛出的异常。
这足以让人们知道可能发生异常。他们可以决定抓住它或让它升级。
修改强>
事实上,你会想要拥有Java的throws
关键字。不幸的是,在C#中它是does not exist。
答案 1 :(得分:1)
不应强迫开发人员捕获和处理代码中的异常。如果他们的代码无法从异常原因中合理地恢复,则不应该被捕获,异常应该冒出来。
答案 2 :(得分:1)
无法让编译器按照您的要求执行操作。编译器检查对象状态是否正确的最接近的是代码契约http://msdn.microsoft.com/en-us/library/dd264808.aspx
答案 3 :(得分:1)
我认为处理这种情况最简洁的方法是使用模板方法来执行save并要求子类在抛出异常时提供错误处理程序的实现:
public abstract class SaveableObject
{
public void Save()
{
try
{
ValidationClass.BeforeSave();
this.SaveCore();
}
catch(ExceptionType ex)
{
OnSaveException(ex);
}
}
protected abstract void OnSaveException(ExceptionType ex);
protected abstract void SaveCore();
}