بلاک finally
بلاک finally شامل دستوراتی برای اجرا پس از اجرای بلاکهای try و catch میباشد، اما قبل از دستوراتی که در ادامه دستورات try…catch می آید اجرا میگردد. استثنا چه ایجاد شود یا نشود به هر صورت بلاک finally اجرا میگردد. اگر یک استثنا ایجاد گردد، حتی اگر بلاک catch استثنا را کنترل نکند، دستورات درون بلاک finally اجرا میگردد.
میتوان برای ساختن اسکریپت مواجه با خطا در هنگام رخ دادن استثنا از بلاک finally استفاده کرد. برای مثال، ممکن است که نیاز به انتشار منبع اسکریپت داشته باشیم. مثال زیر یک فایل را باز میکند و سپس دستورات آن را اجرا میکند ( جاوا اسکریپت سمت سرور به شما اجازه دسترسی به فایلها را میدهد). اگر یک استثنا در هنگام باز شدن فایل رخ بدهد، بلاک finally قبل از اینکه اسکریپت با شکست روبرو شود، فایل را میبندد.
openMyFile();
try {
writeMyFile(theData); //This may throw a error
} catch(e) {
handleError(e); // If we got a error we handle it
} finally {
closeMyFile(); // always close the resource
}
اگر بلاک finally یک مقدار را بازگرداند، این مقدار، بدون در نظر گرفتن عبارات return در بلاکهای try و catch مقدار بازگردانده شده میشود:
function f() {
try {
console.log(0);
throw "bogus";
} catch(e) {
console.log(1);
return true; // تا هنگامی که بلاک finally تمام شوداین عبارت return
// به حالت تعلیق در می آید
console.log(2); // not reachable
} finally {
console.log(3);
return false; // باز نویسی "return" قبلی
console.log(4); // دسترس پذیر نیست
}
// "return false" الان اجرا میشود
console.log(5); // دسترس پذیر نیست
}
f(); // alerts 0, 1, 3; returns false
بازنویسی مقادیر بازگشتی توسط بلاک finally در اجرای استثنائات یا اجرای دوباره درون بلاک catch اعمال میشود:
function f() {
try {
throw "bogus";
} catch(e) {
console.log('caught inner "bogus"');
throw e; // this throw statement is suspended until
// finally block has completed
} finally {
return false; // overwrites the previous "throw"
}
// "return false" is executed now
}
try {
f();
} catch(e) {
// this is never reached because the throw inside
// the catch is overwritten
// by the return in finally
console.log('caught outer "bogus"');
}
// OUTPUT
// caught inner "bogus"