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

3

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

2
难道没有抛出异常是因为文件确实存在吗? - Igor
@Lee,是的,我正在调试,但是 VS 从未进入 catch 块。 - Dimt
实际上,它也应该在“_customConfig = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None)”上失败,因为文件现在为空。 - Dimt
1
@ams4fy 是的,我创建了一个针对 .net 4.0 的控制台应用程序。这是我编写的代码:http://pasted.co/8f260684 - Abey
1
@Abey,这不是一个缺陷。原因是当您切换 .net 版本时,app.config 会被创建并放置在根文件夹中。然后,在构建之后,它会被复制到 bin 文件夹中,您的 if 语句就会通过(不会抛出异常)。当您切换回来时,app.config 仍然存在。 - ams4fy
显示剩余20条评论
1个回答

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

我的VS调试器像其他调试器一样捕获Activator.CreateInstance的异常。 - ams4fy
这正是我遇到的问题,就像Abey所描述的那样。当手动执行控制台应用程序时,它可以正常工作,但出现了相同的行为。 - Dimt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接