在c#中捕获自定义异常

时间:2013-08-14 16:57:48

标签: c# custom-exceptions

我已经创建了一个自定义异常类,如下所示

namespace testingEXception
{
    public class CustomException : Exception
    {            
        public CustomException()
        {
        }
        public CustomException(string message)
            : base(message)
        {
        }

        public CustomException(string message, Exception innerException)
            : base(message, innerException)
        {

        }
    }
}

我在同一个解决方案中抛出了来自不同项目的异常

namespace ConsoleApplication1
{
    public class testClass
    {
        public void compare()
        {
            if (1 > 0)
            {
                throw new CustomException("Invalid Code");
            }
        }
    }
}

并像这样抓住它

    namespace testingEXception
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                testClass obj = new testClass();
                obj.compare();

            }
            catch (testingEXception.CustomException ex)
            {
                //throw;
            }
            catch (Exception ex)
            {
               // throw new CustomException(ex.Message);
            }

            Console.ReadKey();
        }
    }
}

问题是,异常不会被第一个catch捕获,而是被第二个catch捕获,但异常类型显示CustomException。

1 个答案:

答案 0 :(得分:1)

您需要提供更多详细信息,以下代码输出“CustomException”:

try
{
    throw new CustomException("Invalid code.");
}
catch (CustomException ex)
{
    System.Diagnostics.Trace.WriteLine("CustomException");
    throw;
}
catch (Exception ex)
{
    throw;
}

使用以下课程:

public class CustomException : Exception
{
    public CustomException()
    {
    }
    public CustomException(string message)
        : base(message)
    {
    }

    public CustomException(string message, Exception innerException)
        : base(message, innerException)
    {

    }
}

更新

关于优化和优化远离throw:这不可能发生,因为任何特定的代码块都无法知道堆栈中较高的调用者是否可以拥有捕获CustomException的代码。抛出异常是可见的副作用,并且CLI中有各种保证以确保这些可见的副作用仍然可见。

此外,尝试,捕获和最后块是CLI中的“受保护区域”。这些区域的特殊之处在于区域内具有“可见”副作用的操作不能重新排序其可见的副作用。有关更多详细信息,请参阅http://lynk.at/qH8SHkhttp://lynk.at/pJcg98