По последнему пункту:
finally не "заменяет" исключение, а генерирует еще одно, оно вылетает, поэтому первоначальное мы уже не можем увидеть. Чтобы увидеть, можно так:
try {
throw new Error(404)
} catch (ex) {
console.info(ex)
} finally {
alert("Пыщь-пыщь")
throw new Error(406)
}
Niar, форматируйте код отступами, влом читать