diff --git a/py/lexer.c b/py/lexer.c
index 1f1eb6caec9d2d996fa2dd11f0970d1b0f4967d4..c77b459ebf0134f357f9ccbbf7c93d8aa3d83315 100644
--- a/py/lexer.c
+++ b/py/lexer.c
@@ -500,7 +500,9 @@ STATIC void mp_lexer_next_token_into(mp_lexer_t *lex, bool first_token) {
                         }
                         #endif
                         else {
-                            assert(!"TODO: Throw an error, invalid escape code probably");
+                            // unicode character out of range
+                            // this raises a generic SyntaxError; could provide more info
+                            lex->tok_kind = MP_TOKEN_INVALID;
                         }
                     }
                 } else {
diff --git a/tests/unicode/unicode.py b/tests/unicode/unicode.py
index 57075f7e3e42911bf06daeb4d9f6e011de7a51a8..3ed74b79004831b9dbea3a231290a2149c2e702b 100644
--- a/tests/unicode/unicode.py
+++ b/tests/unicode/unicode.py
@@ -20,3 +20,9 @@ print(enc, enc.decode() == s)
 # printing of unicode chars using repr
 # TODO we don't do this correctly
 #print(repr(s))
+
+# test invalid escape code
+try:
+    eval('"\\U00110000"')
+except SyntaxError:
+    print('SyntaxError')