2016-08-01 18 views
2

Ich kann keine Ausnahme von einer generischen abstrakten Klasse in der Client-App abfangen. Der Grund, warum die Ausnahme im Konstruktor ausgelöst werden soll, ist, dass die Funktionalität der Konfigurationsdatei in den abgeleiteten Klassen identisch sein muss und deshalb sehe ich keinen Grund, dies in jeder abgeleiteten Klasse zu implementieren. Die Ausnahme sollte in der übergeordneten generischen Klasse AgentModule<T> behandelt werden, dies ist jedoch aus einem mir unbekannten Grund nicht der Fall.C# So fangen Sie eine Exception für generischen abstrakten Klassenkonstruktor

Ich kann die Ausnahme abfangen, wenn ich den Code in eine Methode verschieben und von der Client-Klasse aufrufen.

Die abstrakte Klasse:

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

Die allgemeine übergeordnete Klasse:

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

Abgeleitete Klasse:

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

Könnte es geworfen bekommen, dass keine Ausnahme ausgelöst wird, da die Datei vorhanden ist? – Igor

+0

Ist das Ihr tatsächlicher Code oder fangen Sie tatsächlich 'FileNotFoundException' in der Basisklasse? 'Activator.CreateInstance' löst eine' TargetInvocationException' aus, wenn der aufgerufene Konstruktor eine Fehlermeldung auslöst. – Lee

+0

@Igor, nein die VS zeigt 'FileNotFoundException wurde von Benutzercode entgandled ' – Dimt

Antwort

1

Die Visual Studio-Debugger jede Ausnahme nicht für was auch immer fangen geschieht innerhalb Activator.CreateInstance(). Aber wenn Sie die exe manuell/programmgesteuert ausführen, wird diese Ausnahme behandelt. Sie können sogar die Ausnahme im Konstruktor der Importeur Klasse aus der Innerexception bei AgentModule.Run()

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

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

Danke, das hilft. – Dimt

+0

Mein VS-Debugger fängt die Ausnahme von Activator.CreateInstance wie jede andere ab. – ams4fy

+0

Das ist genau mein Problem, wie von Abey beschrieben. Haben Sie das gleiche Verhalten, es funktioniert gut, wenn Sie die Konsole App manuell ausführen. – Dimt