Почему несколько блоков try..catch не работают в том же методе в c # 2.0? - PullRequest
2 голосов
/ 13 марта 2012

Я делаю это в событии Form_Load() настольного приложения

string strDay = DateTime.Now.DayOfWeek.ToString().ToUpper();

            try
            {
                fnBirthDayReminder();
            }
            catch (Exception ex)
            {
            }

            try
            {
                if (strDay == "SUNDAY" || strDay == "TUESDAY" || strDay == "THURSDAY")
                {
                    fnAwaitingLeaveApplicationReminder();
                }
            }
            catch (Exception ex)
            {
            }

            try
            {
                fnLeavePlanRemainder();
            }
            catch (Exception ex)
            {
            }

            try
            {
                fnContractExpiryRemainder();
            }
            catch (Exception ex)
            {
            }

            Application.Exit();

Но приложение существует сразу после выполнения первого блока try..catch.Даже если я поставлю точку останова на следующую попытку ... поймать, эти точки останова не будут достигнуты.Я действительно смущен таким загадочным поведением.Пожалуйста, помогите!

Для всех вас: «, если один метод вызывает исключение, другие методы не будут запускаться. », это основная причина, по которой я использую отдельные блоки try..catch.Таким образом, даже если функция выдает исключение, может выполняться следующее.

Edit2
Можете ли вы предложить мне хороший подход, отличный от того, который я здесь использую для выполнения следующей функциидаже если исключение произошло во время первой функции.То, что некоторые из вас предлагают (вызывая все функции в одном блоке try с несколькими блоками перехвата), не сработает, это точно.Я думаю о перекодировании методов, не тратя больше времени.

Ответы [ 5 ]

2 голосов
/ 13 марта 2012

Установите точку останова на Application.Exit(); и проследите, чтобы она достигла цели после выброса исключения или нет.

Если точка останова не достигнута, ваше решение ясно. В этом случае ваш код выдает ThreadException или UnhandedException, которые заставляют вашу программу неожиданно закрываться.

Вы можете поймать это исключение, выполнив что-то подобное в вашем Program.cs, чтобы избежать неожиданного закрытия приложения:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    try
    {
        Application.Run(new Form1());
    }
    catch (Exception e)
    {
        HandleException(e);
    }

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    HandleException(e.Exception);
}

static void HandleException(Exception ex)
{
    //Do Something
}
2 голосов
/ 13 марта 2012

Использование такого кода не рекомендуется.Попробуйте использовать один try блок и перехватывать исключения в нескольких catch блоках.

 try
 {
    fnBirthDayReminder();
    fnLeavePlanRemainder();
    fnContractExpiryRemainder();
    //...
 }
 catch(IOException ex)
 {
    //do something
 }

 //catch(...)

 catch(Exception ex)
 {
    //do something
 }

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

PS2: Порядок catch блоков изменился.(Спасибо @ChrisF)

2 голосов
/ 13 марта 2012

Вы пытались поместить точку останова в первый блок catch и проверить сообщение об исключении / трассировку стека? Я иногда замечал, что приложение может закрываться для определенных типов исключений, например stackoverflow, а не ожидаемое поведение.

            try
            {
                fnBirthDayReminder();
            }
            catch (Exception ex)
            {
                Debugger.Break();
            }

Наконец, ваши методы не должны генерироваться при нормальных обстоятельствах. Постарайтесь выяснить, почему они есть, и устранить ошибки.

0 голосов
/ 13 марта 2012

Действительно, стандартный способ использования блока try-catch состоит в использовании нескольких блоков catch с одним блоком try .....

        try
        {
            fnBirthDayReminder();
            if (strDay == "SUNDAY" || strDay == "TUESDAY" || strDay == "THURSDAY")
            {
                fnAwaitingLeaveApplicationReminder();
            }
            fnLeavePlanRemainder();
            fnContractExpiryRemainder();
        }
        catch (Exception ex)
        { 

        }
        Application.Exit();
0 голосов
/ 13 марта 2012

Уверен, что вам нужен, наконец, там, так как попытка может иметь несколько ловушек, но не несколько попыток в контексте функции.

try { myfunc(); }
catch(Exception ex) { doSomething(); }
finally {}
//time for next try
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...