Существуют два главные проблемы в действии здесь...
Во-первых, к моему знанию, только CPython имеет RAII - необходимо закрыть собственные ресурсы в Jython, Ironpython, и т.д.
И Во-вторых, как был упомянут, потокобезопасность.
Таким образом, вы можете обернуть критические части в try / catch и, по крайней мере, это означает, что тип не потерпит неудачу при инициализации, но, конечно, если код инициализации настолько критичен, тогда это поведение на самом деле хорошо - тип не может использоваться в этом неинициализированном состоянии.
Другой вариант - сделать это как одноэлементный - каждый раз, когда вы пытаетесь получить экземпляр, вы можете создавать тип правильно, пока не добьетесь успеха, даже если он потерпит неудачу в первый раз.
Вам все равно потребуется некоторая обработка ошибок в вызывающей стороне в случае, если Instance вернет вам null в первый (или второй и т. д.) раз.
Изменить: И если вам не нужен синглтон, просто пусть ваш конструктор экземпляра инициализирует статические части
, например,
private object _lock = new object()
private bool _initialized;
public T()
{
lock(_lock)
{
if(!_initialized)
{
try
{
//Do static stuff here
}
catch(Exception ex_)
{
//Handle exception
}
}
}
}
Временным решением, которое я использовал в прошлом, является создание синглтона.Сделайте статический конструктор ошибочным тогда и только тогда, когда сбой означает, что все приложение не может работать.
Урок здесь довольно прост: не делайте в статическом конструкторе ничего, что могло бы привести к сбою.