繁体   English   中英

C#如何捕获泛型抽象类构造函数的异常

[英]C# How to catch an exception on generic abstract class constructor

我无法从客户端应用程序中的通用抽象类中捕获异常。 我希望在构造函数中抛出异常的原因是配置文件功能在派生类中需要相同,因此我没有理由在每个派生类中实现它。 该异常应该在总体通用类AgentModule<T>中处理,但是,由于我不知道的原因,情况并非如此。

当我将代码移动到方法并从客户端类调用时,我可以捕获异常。

抽象类:

public abstract class Importer
{
    public abstract string Name { get; }
    public abstract string Description { get; }

    private System.Configuration.Configuration _customConfig;

    public Importer()
    {
        string customConfigFile = this.GetType().Assembly.Location + ".config";

        if (System.IO.File.Exists(customConfigFile))
        {
            System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = customConfigFile;
            _customConfig = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None);
        }
        else
        {
            throw new System.IO.FileNotFoundException("Could not load configuration file: " + customConfigFile);
        }
    }

    public abstract void Load(ILogger logger);
}

通用的总体类:

public class AgentModule<T> : ModuleBase where T : Importer, new()
{
    private Importer _importer;

    public override void Run()
    {
        try
        {
            _importer = (Importer)Activator.CreateInstance<T>();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

派生类:

public class XLoad : Importer
{
    public override string Name { get { return _name; } }
    public override string Description { get { return _description; } }

    private string _name;
    private string _description;  

    public XLoad()
    {
        _name = "Load";
        _description = "some desc";

    }

    public override void Load(ILogger logger)
    {
        Console.WriteLine("I am loading");
    }
}

Visual Studio调试器不会捕获Activator.CreateInstance()中发生的任何异常。 但是如果您手动/以编程方式执行exe,则将处理此异常。 您甚至可以从AgentModule.Run()的InnerException获取Importer类的构造函数抛出的异常。

try
    {
       _importer = (Importer)Activator.CreateInstance<T>();
    }
catch (Exception e)
     {
        Console.WriteLine(e.Message);

         if(e.InnerException != null)
            Console.WriteLine(e.InnerException.Message );
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM