列表排序中的未处理异常

时间:2009-11-19 20:58:01

标签: c# .net

所以,我有一个包含自定义类的列表, 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;
        }

    }

}

3 个答案:

答案 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异常)。