所以,我有一个包含自定义类的列表, MyClass
MyClass 具有属性,可以为null(但不应该是)。
当使用自定义排序器排序此类时,排序器访问此null属性并抛出异常,该异常被视为未处理,即使在排序方法周围存在try-catch块。
现在由于某种原因,异常仍然被写入控制台,这是异常处理程序正在做的事情。
我有一个真正的应用程序有同样的问题,导致我的单元测试失败,即使异常处理正确,我无法解释这一点。
所以我附上了一些示例代码来更好地解释自己,从VS运行它。
更新的代码
的结果:
System.InvalidOperationException
无法比较数组中的两个元素
完成!的
所以它似乎正在处理我的自定义异常,并抛出它自己的?
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;
}
}
}
答案 0 :(得分:3)
在Sort
方法周围有一个try / catch块,是 - 并且该catch块捕获异常。换句话说,Sort
抛出一个异常,你的catch块就会捕获它。它没有传播到Main
以外 - 所以“完成!”打印出来。
这正是我所期待的。在你的经历中,它以什么方式“未处理”?您是否期望Sort
不要抛出异常?它需要做一些事情来表明未能比较两个元素,这似乎是最合适的行动方案。
您的单元测试以何种方式失败?你是故意给他们无效的数据吗?您希望比较代码如何对无效数据做出反应?如果它应该忽略它(并返回基于另一个属性的比较),那么你应该主动检查属性而不是让异常传播。在大多数情况下,如果这表明之前存在错误,我宁愿允许异常。
编辑:基于你的其他评论,听起来你正在做适当的事情,让异常冒出来 - 但是你不清楚你看到异常没有被处理的方式。
如果你在调试器中运行,它可能会破坏被抛出的异常,但这并不意味着它不会被处理。尝试更改例外设置或在没有调试器的情况下运行。
编辑:是的,Sort
将捕获异常并抛出InvalidOperationException
- 但您可以使用该异常的InnerException
属性来获取原始异常。遗憾的是documentation没有指明这一点:(
答案 1 :(得分:0)
例如,当它检查字符串“1”不等于null时。但它希望比较“1”字符串的长度和null =&gt;这是不可能的。
答案 2 :(得分:-1)
我假设你使用.Net Framework 4.0。新的东西是不能再捕获NullRefenrenceException(类似于OutOfMemory异常)。