Использование Try-Catch-Наконец для обработки арифметических исключений - PullRequest
0 голосов
/ 02 июля 2011

Я хотел бы попробовать ДВУХ разных вещей (у обоих есть большая вероятность отказа), и по этой причине я хотел бы использовать оператор "finally" для запуска "безопасности" на случай, если первые две попытки оба терпят неудачу.

Возьмите следующий пример (нет, это не тот код, который я использую в своем проекте!).

int zero = 0;
int one = 1;

try
{
    // Throws ' cannot divide by zero ' error
    int error = one / zero;
}

catch
{
    // Throws error again of course
    int somenum = one / zero;
}

finally 
{
    MessageBox.Show("I can never make it here ..."); 
}

Итак, я бы хотел, чтобы моя программа сделала следующее:

  1. Попытка деления на ноль
  2. Если на шаге 1 произойдет сбой , я бы хотел, чтобы оператор 'catch' выполнил свой код (который в этом примере снова должен завершиться ошибкой).
  3. ЕСЛИ оба шага # 1 и # 2 не выполнены, я бы хотел, чтобы моя программа отображала MessageBox в операторе 'finally'.

Я даже близко с этим?

Ответы [ 5 ]

5 голосов
/ 02 июля 2011
int zero = 0;
int one = 1;

try {
    try
    {
        // Throws ' cannot divide by zero ' error
        int error = one / zero;
    }

    catch (DivideByZeroException)
    {
        // Throws error again of course
        int somenum = one / zero;
    }
}
catch (DivideByZeroException)
{
    MessageBox.Show("I can never make it here ...");
}
0 голосов
/ 02 июля 2011

Причина в том, что вы генерируете исключение в блоке catch и не обрабатываете его.

try
{
    int error = one / zero; // throws an exception
}
catch // catches
{
    int somenum = one / zero; // throws again
}
// no code to handle the exception
// application crashes

Вы можете избежать размещения вложенного блока try catch.

0 голосов
/ 02 июля 2011

Судя по моему опыту, вам понадобится сделать еще одну попытку в первом улове:

        int zero = 0;
        int one = 1;

        try
        {
            // Throws ' cannot divide by zero ' error
            int error = one / zero;
        }

        catch
        {
            try
            {
                 // Throws error again of course
                 int somenum = one / zero;
            }
            catch { }
        }

        finally 
        {
            MessageBox.Show("I can never make it here ..."); 
        }
0 голосов
/ 02 июля 2011

В практике Inbest вы не должны помещать код в catch , в котором возможен сбой.

для вашего примера вы должны использовать вложенный try-catch-finally

            int zero = 0;              
            int one = 1;
            bool flag=false;                
            try              
            {     
                try
                {
                    int error = one / zero; 
                }
                catch
                {
                    flag=false;
                }
                if(flag==false)               
                   int error = one / zero;              
            }                
            catch              
            {                  
                MessageBox.Show("I can never make it here ...");        
            } 

используйте раздел finally , чтобы освободить свой ресурс, и когда вы захотите, после того, как попытаетесь или поймаете, ваш код выполнится на 100%.

0 голосов
/ 02 июля 2011

То, что вы делаете, будет работать.но учтите, что после сообщения, отображаемого в блоке finally, исключение будет переброшено.

...