Published at
Updated at
Reading time
1min
This post is part of my Today I learned series in which I share all my web development learnings.

Today I woke up checked Slack and saw a little trick question by my friend Tomasz in one of the JavaScript channels.

function f() {
  try {
    return 'A';
  } finally {
    return 'B';
  }
}

f(); // ?

I don't use the finally block in try/catch statements very often so I was not sure what the return value will be for this snippet. It turns out the finally block goes over everything according to MDN:

If the finally block returns a value, this value becomes the return value of the entire try-catch-finally production, regardless of any return statements in the try and catch blocks.

So let's have a look at a few examples:

function f() {
  try {
    return 'A';
  } finally {
    return 'B';
  }
}

f(); // 'B'

// ***********************************************

function g() {
  try {
    throw new Error( 'Foo' );
  } catch( e ) {
    return 'A';
  } finally {
    return 'B';
  }
}

g(); // 'B'

// ***********************************************

function h() {
  try {
    throw new Error( 'Foo' );
  } finally {
    return 'B';
  }
}

h(); // 'B' (without throwing an exception)

// ***********************************************

function i() {
  try {
    throw new Error( 'Foo' );
  } catch( e ) {
    throw new Error( 'Bar' );
    return 'A';
  } finally {
    return 'B';
  }
}

i(); // 'B' (without throwing an exception)

finally overwrites return statements and also "catches" exceptions. Good to know. ;)

Was this TIL post helpful?
Yes? Cool! You might want to check out Web Weekly for more quick learnings. The last edition went out 1 days ago.
Stefan standing in the park in front of a green background

About Stefan Judis

Frontend nerd with over ten years of experience, freelance dev, "Today I Learned" blogger, conference speaker, and Open Source maintainer.

Related Topics

Related Articles