Подтвердить что ты не робот

Возвратитесь в try & catch или return in finally?

Является ли это одним из этих рисков? Это лучше? Или это одна из тех вещей, которые вы распечатываете и бросаете дротик, чтобы решить?

Я хочу сделать это сейчас, чтобы понять, как работает:

try { 
    stuff that changes something... 
}
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
}
finally { 
    stuff.close();
    return something; 
}

Но я видел:

try { 
    stuff that changes something...
    return something; 
}
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
    return something; 
}
finally { 
    stuff.close(); 
}
4b9b3361

Ответ 1

Вы не можете return от finally. Вы получите ошибку компилятора:

Элемент управления не может покинуть тело предложения finally


Если целевой класс реализует IDisposable, я бы сделал следующее:

using (stuff s = new stuff())
{
    return stuff;
}

или

using (stuff s = new stuff())
{
    try
    {
        // do stuff
        return stuff;
    }
    catch (Exception ex)
    {
        // do logging or another stuff
        return something;
    }
}

вызовет Dispose() для вас, если это потребуется/возможно.

Ответ 2

Лично я бы не стал использовать и


try { 
    stuff that changes something... 
}
catch (System.Exception ex) { 
    something.worked = false; 
    something.err = ex.Message; 
}
finally { 
    stuff.close();    
}
return something; 

Также в инструкции finally убедитесь, что вам нужно закрыть/удалить объекты, поскольку они, возможно, никогда не были открыты/установлены, если они потерпели неудачу.

Также см. здесь Неужели плохая практика возвращается из блока finally catch try?

Ответ 3

Во втором подходе нет риска. Но он позволяет вам возвращать разные значения в случае исключений.