diff --git a/Libraries/LibJS/Parser.cpp b/Libraries/LibJS/Parser.cpp index 51ea22e96b..c2b6e340c4 100644 --- a/Libraries/LibJS/Parser.cpp +++ b/Libraries/LibJS/Parser.cpp @@ -1443,7 +1443,10 @@ NonnullRefPtr Parser::parse_try_statement() consume(TokenType::Try); auto block = parse_block_statement(); - auto handler = parse_catch_clause(); + + RefPtr handler; + if (match(TokenType::Catch)) + handler = parse_catch_clause(); RefPtr finalizer; if (match(TokenType::Finally)) { @@ -1451,6 +1454,9 @@ NonnullRefPtr Parser::parse_try_statement() finalizer = parse_block_statement(); } + if (!handler && !finalizer) + syntax_error("try statement must have a 'catch' or 'finally' clause"); + return create_ast_node(move(block), move(handler), move(finalizer)); } diff --git a/Libraries/LibJS/Tests/try-catch-finally.js b/Libraries/LibJS/Tests/try-catch-finally.js index 7aca91c500..1ff0104734 100644 --- a/Libraries/LibJS/Tests/try-catch-finally.js +++ b/Libraries/LibJS/Tests/try-catch-finally.js @@ -161,3 +161,12 @@ test("try/catch/finally with exception in try, catch and finally", () => { expect(catchHasBeenExecuted).toBeTrue(); expect(finallyHasBeenExecuted).toBeTrue(); }); + +test("try statement must have either 'catch' or 'finally' clause", () => { + expect("try {} catch {}").toEval(); + expect("try {} catch (e) {}").toEval(); + expect("try {} finally {}").toEval(); + expect("try {} catch {} finally {}").toEval(); + expect("try {} catch (e) {} finally {}").toEval(); + expect("try {}").not.toEval(); +});