Вернуть в try & catch против возврата в конце концов? - PullRequest
12 голосов
/ 26 августа 2011

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

Я хочу сделать это сейчас, когда я понимаю, как, наконец, работает:

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(); 
}

Ответы [ 3 ]

17 голосов
/ 26 августа 2011

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


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

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

Также см. Здесь Плохо ли возвращаться из блока try catch, наконец?

17 голосов
/ 26 августа 2011

Вы не можете 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(), если это потребуется / возможно.

0 голосов
/ 26 августа 2011

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

...