بازگشت به درس

بند finally یا فقط کد؟

اهمیت: 5

این دو قطعه کد را مقایسه کنید.

  1. کد اول از finally برای اجرای کد بعد از try...catch استفاده می‌کند:

    try {
      انجام کارها
    } catch (err) {
      مدیریت ارورها
    } finally {
      پاک سازی فضاری کاری
    }
  2. قطعه دوم پاک سازی را درست بعد از 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 قرار دهیم، در این موقعیت‌ها اجرا نمی‌شود.