Введите инициализатор (статический конструктор) обработка исключений

Существуют два главные проблемы в действии здесь...

Во-первых, к моему знанию, только CPython имеет RAII - необходимо закрыть собственные ресурсы в Jython, Ironpython, и т.д.

И Во-вторых, как был упомянут, потокобезопасность.

11
задан Thorarin 25 August 2009 в 14:00
поделиться

3 ответа

Таким образом, вы можете обернуть критические части в 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
         }
      } 
   }
}
3
ответ дан 3 December 2019 в 10:44
поделиться

Временным решением, которое я использовал в прошлом, является создание синглтона.Сделайте статический конструктор ошибочным тогда и только тогда, когда сбой означает, что все приложение не может работать.

1
ответ дан 3 December 2019 в 10:44
поделиться

Урок здесь довольно прост: не делайте в статическом конструкторе ничего, что могло бы привести к сбою.

4
ответ дан 3 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: