【问题标题】:throw custom exception collect info and throw again抛出自定义异常收集信息并再次抛出
【发布时间】:2016-06-20 18:57:10
【问题描述】:

我的项目要求解析给定目录中的文件。我创建了诸如 MyDirectory、MyFiles、MyRecords 和 MyFields 之类的类......它基本上是我的数据在内存中的表示。我需要异常处理方面的帮助。我想记录异常并在屏幕上显示错误。如果在 MyFields 类级别发生异常,我想将字段名称添加到 CustomErrorString,向 MyRecords 类抛出异常。在 MyRecords 类中捕获该异常,将记录编号附加到 CustomErrorString,向 MyFiles 类抛出相同的异常。在 MyFiles 类中捕获异常将文件名附加到 CustomErrorString 等...你们谁能告诉我如何为此创建自定义异常处理类以及如何在各种类中处理它并处理一般 system.Exception?

【问题讨论】:

    标签: c# exception-handling try-catch


    【解决方案1】:

    您可以创建自定义例外。例如,像这样简单的事情:

    public class MyException : Exception
    {
        public string SomeProperty { get; set; }
    
        public MyException(string message, string someProperty, Exception innerException)
            : base(message, innerException)
        {
            SomeProperty = someProperty;
        }
    }
    

    当捕获任何异常时,您可以在自定义异常中包装该异常,将原始异常设置为内部异常:

    catch (Exception ex)
    {
        throw new MyException("Custom error message", "Custom info", ex);
    }
    

    当然,您还可以在 catch 块中做任何您喜欢的事情。日志信息等。您可以随意设计自定义异常及其构造函数。

    这里的要点是保留原始异常,未经修改,作为新异常的属性。堆栈中想要向异常添加信息的每一层都应该通过将其包装在自己的异常中来实现,该异常可以具有您喜欢的任何自定义属性。

    【讨论】:

    • 谢谢大卫。你能详细说明你的最后一段吗?我怎样才能保留原始异常的价值?我是否需要在 MyException 类中创建类似于 public static StringBuilder MyCustomError 变量的东西,并在我在调用函数上捕获它时继续向其附加字符串?
    • @bansi:将原始异常设置为.InnerException 属性(这是本示例中使用的base() 构造函数所做的)将保留原始异常。因此,例如,如果您在堆栈中执行此操作 3 次,那么您将总共有 4 个异常,每个异常都是另一个异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2011-10-06
    • 2015-07-14
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多