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");
}
}
Könnte es geworfen bekommen, dass keine Ausnahme ausgelöst wird, da die Datei vorhanden ist? – Igor
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
@Igor, nein die VS zeigt 'FileNotFoundException wurde von Benutzercode entgandled ' – Dimt