Можно ли условно выполнить оператор, если нет исключения? - PullRequest
0 голосов
/ 12 сентября 2018

Рассмотрим следующую функцию. Я написал это на C #.

public void Test()
{
    statement1;
    try
    {
        statement2;
    }
    catch (Exception)
    {
        //Exception caught
    }
}

Я хочу выполнить statement1, только если statement2 не вызывает исключений. Возможно ли выполнить statement1 только тогда, когда statement2 не выдает никаких исключений?

Ответы [ 7 ]

0 голосов
/ 12 сентября 2018

Вы можете вызвать метод после исключения,

public void Test(bool noerror= false)
{
   if (noerror)
      statement1;

    try
    {
        statement2;
        completed=true;
    }
    catch (Exception)
    {
         noerror=true;
        Test(noerror)
        //Exception caught
    }

}
0 голосов
/ 12 сентября 2018

Да, вы можете, все, что вам нужно сделать, это переместить оператор 1 в оператор 2, так как компилятор достигнет оператора1, только если оператор 2 не выдал никакого исключения.Код ниже:

 public void Test()
{
try
{
    statement2;
    statement1;
}
catch (Exception)
{
    //Exception caught
}
}
0 голосов
/ 12 сентября 2018

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

public void Test()
{
   bool hasException = false;
   statement1;
   try
   {
       statement2;
   }
   catch (Exception)
   {
       hasException = true;
   }
   finally
   {
       if(hasException)
           Test();
   }
}
0 голосов
/ 12 сентября 2018

Да, вы можете легко сделать это таким образом

public void Test()
{
    try
    {
        statement2;
        statement1;
    }
    catch (Exception)
    {
        //Exception caught
    }
}

Statement1 не будет работать, если Statement2 выдает некоторые исключения.

Другой способ, не такой крутой, - использовать переменную

public void Test()
    {
        bool completed=false;
        try
        {
            statement2;
            completed=true;
        }
        catch (Exception)
        {
            //Exception caught
        }
        if (completed)
          statement1;
    }
0 голосов
/ 12 сентября 2018

Да, есть, и вы на самом деле используете его (но неправильно).

Блок

try...catch предназначен для перехвата исключений и выполнения соответствующих действий вне зависимости от того, было выброшено исключение:

try
{
    // risky operation that might throw exception
    RiskyOperation();
    // here code is executed when no exception is thrown
}
catch(Exception ex)
{
    // code here gets executed when exception is thrown
}
finally
{
    // this code evaluates independently of exception occuring or not
}

Чтобы подвести итог, нужно сделать:

try
{
    statement2;
    statement1;
}
catch(Exception ex)
{
    // code here gets executed when exception is thrown
}
0 голосов
/ 12 сентября 2018

Если я правильно понял ваш вопрос, это то, что вы хотите (перемещение statement1; в statement2;):

try
{
    statement2;
    statement1;
}
catch (Exception)
{
    //Exception caught
}

Используя этот способ, statement1 будет выполняться, только если statement2 не вызывает исключений!

0 голосов
/ 12 сентября 2018

Изменение порядка и логики высказываний.Вы не можете предвидеть исключение во время выполнения

...