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

时间:2016-08-01 13:11:14

标签: c# .net-4.5

我无法从客户端应用程序中的通用抽象类中捕获异常。我希望在构造函数中抛出异常的原因是配置文件功能在派生类中需要相同,因此我没有看到在每个派生类中实现此功能的原因。该异常应该在总体通用类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");
    }
}

1 个答案:

答案 0 :(得分:1)

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 );
      }