Вопрос

Я копался так, чтобы ответить на это, и лучшее, что я могу найти до сих пор, это здесь, однако, это ориентировано на экземпляры со статическими конструкторами; Я использую только класс статически.

Мой код:

public static class MailHelper {

    private static string mailHost;

    static MailHelper() {

        var mailSettings = ConfigurationManager.GetSection("MailSettings") as NameValueCollection;
        if (null == mailSettings) {
            throw new ConfigurationErrorsException("Missing Mail Settings in the configuration file");
        }

        mailHost = ConfigurationManager.AppSettings["mailHost"];
        if (null == mailHost) {
            throw new ConfigurationErrorsException("Missing mailHost setting in the configuration file");
        }

    }

    public static void SendMail(MailMessage Message) {
        ...
    }

}


try {
    MailHelper.SendMail(Message);
}
catch (ConfigurationErrorsException exc) {
    ...
}

//  ???    
MailHelper.SendMail(Message);


.

Так что, если статический конструктор бросает исключение в первый раз, когда его называют, что происходит во второй раз, когда я пытаюсь получить доступ к методу static sendmail ()?

PS: Извините, если вам не нравится версия Stroustrup of K & R Brace Styling, но не редактируйте мой пост, просто чтобы изменить скобки на ваш предпочитаемый стиль Allman. Спасибо.

Это было полезно?

Решение

Два других ответа являются хорошими ответами на ваш прямой вопрос - вот метаансовый ветер - вы должны бросить исключение в метод, когда вы обнаруживаете, что элементы конфигурации не заполнены, а не в конструкторе. IMHO, «Не настроенный» является действительным состоянием конфигурации для этих элементов на этапе конструктора, просто не во время Sendmail. Это обойдется всей этой проблемой.

Другие советы

После того, как тип инициализатор потерпел неудачу один раз, его никогда не повторно повторно. Тип мертв для жизни Appdomain. (Обратите внимание, что это верно для всех инициализаторов типа, не только для типов со статическими конструкторами. Тип со статическими переменными с выражениями инициализатора, но без статических конструкторов, может проявлять тонкие различия в времени выполнения инициализатора типа - но это будет все еще случается только один раз.)

Демонстрация:

using System;

public sealed class Bang
{
    static Bang()
    {
        Console.WriteLine("In static constructor");
        throw new Exception("Bang!");
    }

    public static void Foo() {}
}

class Test
{
    static void Main()
    {
        for (int i = 0; i < 5; i++)
        {
            try
            {
                Bang.Foo();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.GetType().Name);
            }
        }
    }
}

Выход:

In static constructor
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException
TypeInitializationException

Как видите, статический конструктор называется только один раз.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top