|
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