【发布时间】:2009-11-19 20:58:01
【问题描述】:
所以,我有一个包含自定义类的列表,MyClass
MyClass 有属性,可以为空(但不应该是)。
当使用自定义排序器对此类进行排序时,排序器访问此 null 属性并引发异常,该异常被视为未处理,即使排序方法周围有一个 try-catch 块。
现在由于某种原因,异常仍然被写入控制台,这就是异常处理程序正在做的事情。
我有一个真正的应用程序存在同样的问题,导致我的单元测试失败,即使异常处理正确并且我无法解释这一点。
所以我附上了一些示例代码来更好地解释自己,从 VS 运行它。
更新代码
结果:
System.InvalidOperationException
无法比较数组中的两个元素。
完成!
所以它似乎正在处理我的 custom 异常,并抛出自己的异常?
using System;
using System.Collections.Generic;
using System.Data;
namespace TestSortException
{
class Program
{
static void Main()
{
try
{
var list = new List<MyClass>
{
new MyClass("1"),
new MyClass(null),
new MyClass("fdsfsdf")
};
list.Sort(new MyClassSorter());
}
catch(Exception e)
{
Console.WriteLine(e.GetType());
Console.WriteLine(e.Message);
}
Console.WriteLine("Done!");
Console.ReadLine();
}
}
class MyClassSorter : IComparer<MyClass>
{
public int Compare(MyClass x, MyClass y)
{
// try
// {
if (x.MyString == y.MyString)
return 0;
// Unhandled??? Exception here
if (x.MyString.Length > y.MyString.Length)
return 1;
return -1;
// }
// catch (Exception)
// {
// return -1;
// }
}
}
class MyClass
{
private string _myString;
public string MyString
{
get
{
if (_myString == null) throw new DataException("MyString is Null");
return _myString;
}
}
public MyClass(string myString)
{
_myString = myString;
}
}
}
【问题讨论】:
-
+1 提供了一个完整的例子。现在看看。
-
为什么不在 Compare 方法中检查 null ?我在想,最好让框架抛出异常。
-
因为我想冒泡到处理它的异常处理程序。