11

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

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。

4

1 回答 1

2

您需要提供更多详细信息,以下代码输出“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)
    {

    }
}

更新:

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

此外,try、catch 和 finally 块是 CLI 语言中的“受保护区域”。这些区域的特殊之处在于,具有“可见”副作用的区域内的操作不能对其可见的副作用进行重新排序。有关更多详细信息,请参阅http://lynk.at/qH8SHkhttp://lynk.at/pJcg98

于 2013-08-15T13:42:05.110 回答