Comment puis-je gérer toutes les exceptions pour une classe similaire au suivant dans certaines circonstances?Comment puis-je gérer toutes les exceptions dans une classe C# où les deux ctor et finalizer jeter des exceptions?
class Test : IDisposable {
public Test() {
throw new Exception("Exception in ctor");
}
public void Dispose() {
throw new Exception("Exception in Dispose()");
}
~Test() {
this.Dispose();
}
}
J'ai essayé, mais ça ne marche pas:
static void Main() {
Test t = null;
try {
t = new Test();
}
catch (Exception ex) {
Console.Error.WriteLine(ex.Message);
}
// t is still null
}
J'ai aussi essayé d'utiliser « en utilisant » mais il ne gère pas l'exception levée de ~ Test();
static void Main() {
try {
using (Test t = new Test()) { }
}
catch (Exception ex) {
Console.Error.WriteLine(ex.Message);
}
}
Des idées comment puis-je contourner?
Dans le second cas (pas d'utilisation), vous n'appelez jamais réellement Dispose(). C# est collecté, donc la classe ne sera pas réellement nettoyée jusqu'à ce que le GC décide qu'il est temps de nettoyer.Le GC n'appelle pas non plus Dispose (même si vous le définissez), c'est donc à vous d'utiliser 'using' ou appelez explicitement Dispose lorsque vous utilisez une classe IDisposable. –
Merci pour votre réponse. En fait, la classe Test n'est pas écrite par moi et c'est simplement à des fins de démonstration, montrant une classe avec un comportement similaire qui est hors de mon contrôle. Le point clé est que, alors que le constructeur lance une exception, l'objet de Test est un semi-produit sans variables de référence. – Frank