بند finally یا فقط کد؟
این دو قطعه کد را مقایسه کنید.
-
کد اول از
finally
برای اجرای کد بعد ازtry...catch
استفاده میکند:try { انجام کارها } catch (err) { مدیریت ارورها } finally { پاک سازی فضاری کاری }
-
قطعه دوم پاک سازی را درست بعد از
try...catch
قرار میدهد:try { انجام کارها } catch (err) { مدیریت ارورها } پاک سازی فضای کاری
ما قطعا به پاک سازی بعد از کار نیاز داریم، مهم نیست که ارور وجود داشته باشد یا خیر.
آیا اینجا استفاده از finally
برتری دارد یا هر دو قطعه کد یکسان هستند؟ اگر برتری وجود داشته باشد، سپس برای زمانی که این برتری مهم است یک مثال بزنید.
تفاوت زمانی آشکار میشود که ما درون یک تابع به کد نگاه کنیم.
اگر یک «پرش به بیرون» از try...catch
وجود داشته باشد، رفتار متفاوت است.
برای مثال، زمانی که یک return
درون try...catch
وجود دارد. بند finally
در صورت هر گونه خارج شدن از try...catch
کار میکند حتی با دستور return
: درست بعد تمام شدن try...catch
اما قبل از اینکه کد فراخوانی شده کنترل را به دست بگیرد.
function f() {
try {
alert('شروع');
return "نتیجه";
} catch (err) {
/// ...
} finally {
alert('پاک سازی!');
}
}
f(); // !پاک سازی
…یا زمانی که یک throw
وجود داشته باشد، مثل اینجا:
function f() {
try {
alert('شروع');
throw new Error("یک ارور");
} catch (err) {
// ...
if("نمیتوانی ارور را مدیریت کنی") {
throw err;
}
} finally {
alert('پاک سازی!')
}
}
f(); // !پاک سازی
این finally
است که در اینجا پاک سازی را تضمین میکند. اگر ما فقط کد را در انتهای f
قرار دهیم، در این موقعیتها اجرا نمیشود.