|
40 | 40 | from textual.css.errors import DeclarationError, StyleValueError |
41 | 41 | from textual.css.match import match |
42 | 42 | from textual.css.parse import parse_declarations, parse_selectors |
43 | | -from textual.css.query import NoMatches, TooManyMatches |
| 43 | +from textual.css.query import InvalidQueryFormat, NoMatches, TooManyMatches |
44 | 44 | from textual.css.styles import RenderStyles, Styles |
45 | 45 | from textual.css.tokenize import IDENTIFIER |
| 46 | +from textual.css.tokenizer import TokenError |
46 | 47 | from textual.message_pump import MessagePump |
47 | 48 | from textual.reactive import Reactive, ReactiveError, _Mutated, _watch |
48 | 49 | from textual.timer import Timer |
@@ -1441,7 +1442,12 @@ def query_one( |
1441 | 1442 | else: |
1442 | 1443 | query_selector = selector.__name__ |
1443 | 1444 |
|
1444 | | - selector_set = parse_selectors(query_selector) |
| 1445 | + try: |
| 1446 | + selector_set = parse_selectors(query_selector) |
| 1447 | + except TokenError: |
| 1448 | + raise InvalidQueryFormat( |
| 1449 | + f"Unable to parse {query_selector!r} as a query; check for syntax errors" |
| 1450 | + ) from None |
1445 | 1451 |
|
1446 | 1452 | if all(selectors.is_simple for selectors in selector_set): |
1447 | 1453 | cache_key = (self._nodes._updates, query_selector, expect_type) |
@@ -1505,7 +1511,12 @@ def query_exactly_one( |
1505 | 1511 | else: |
1506 | 1512 | query_selector = selector.__name__ |
1507 | 1513 |
|
1508 | | - selector_set = parse_selectors(query_selector) |
| 1514 | + try: |
| 1515 | + selector_set = parse_selectors(query_selector) |
| 1516 | + except TokenError: |
| 1517 | + raise InvalidQueryFormat( |
| 1518 | + f"Unable to parse {query_selector!r} as a query; check for syntax errors" |
| 1519 | + ) from None |
1509 | 1520 |
|
1510 | 1521 | if all(selectors.is_simple for selectors in selector_set): |
1511 | 1522 | cache_key = (self._nodes._updates, query_selector, expect_type) |
|
0 commit comments