Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   try, catch, finally. Зачем нужно finally? (http://www.flasher.ru/forum/showthread.php?t=131762)

Psycho Tiger 27.10.2009 19:36

try, catch, finally. Зачем нужно finally?
 
Давно вопрос интересовал, но сейчас решил все таки спросить.
Хелп Адоуба:
Цитата:

Инструкция finally закрывает инструкции, которые будут выполняться независимо от того, обнаружена ошибка в блоке try или нет. Если ошибки нет, инструкции внутри блока finally выполняются после завершения выполнения инструкций блока try. Если ошибка есть, сначала выполняется соответствующая инструкция catch, затем — инструкции блока finally.
So, вообще не вижу смысла в finally.

Код:

try
{
    // some code that could throw an error
}
catch (err:Error)
{
    // code to react to the error
}
finally
{
    trace("here");
}


Код:

try
{
    // some code that could throw an error
}
catch (err:Error)
{
    // code to react to the error

    trace("here");


DarkLight 27.10.2009 19:39

Если в try-catch есть return, то finally выполнится перед return. Используется для освобождения ресурсов, таких как открытые файлы, сокеты, подкдючения к БД

Psycho Tiger 27.10.2009 19:50

Понятно. Жаль, в хелпе не описывают.
Спасибо.

Felicast 27.10.2009 21:48

Цитата:

Если в try-catch есть return, то finally выполнится перед return
это лишь побочный эффект. все, что делает finally очень хорошо прописано в цитате из хелпа, приведенной в первом посте.

Psycho Tiger 27.10.2009 22:18

Цитата:

Сообщение от Felicast (Сообщение 861300)
это лишь побочный эффект. все, что делает finally очень хорошо прописано в цитате из хелпа, приведенной в первом посте.

Тогда сравни два приведенных мной кода. Они совершенно одинаковы.

incoob 27.10.2009 22:56

finally нужен для тех случаев, когда происходит не глобальное отлавливание исключений, а только необходимых и когда нужно гарантированно выполнить какие-то действия перед выходом из блока кода
Код AS3:

                        var obj:MyClass = new MyClass()
                        var res:int
                        try
                        {
                                obj.doSomething()
                                res = 0
                        }
                        catch (e:FirstError)
                        {
                                res = 1
                        }
                        catch (e:SecondError)
                        {
                                res = 2
                        }
                        finally
                        {
                                obj.dispose()
                        }


AL.exe 28.10.2009 00:51

Самое смешное, что я тоже задавал этот вопрос на форуме какое-то время назад, потому что тоже решил, что он не нужен.

На практике нигде не использую, но, в теории, блок нужен для обработки всплывающих ошибок и для финта с return.

Felicast 28.10.2009 11:25

Код AS3:

try 
{
        trace("try1");
        try
        {
                trace("try2");
                throw new Error("error");
          }
        catch(e:Error)
        {
                    trace("catch2");
                throw new Error("error");
          }
        finally
        {
                    trace("finally2");
        }
}
catch(e:Error)
{
            trace("catch1");
}
finally
{
            trace("finally1");
}

попробуйте с finally и без


Часовой пояс GMT +4, время: 21:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.