Besides the problem of detecting the desired kind (explicit/implicit/specific character code) of catcode-1-left braces and catcode-2-right braces another problem might be detecting proper nesting of left braces and right braces.
(Lua-extensions come to my mind but afaik when looking ahead via Lua-code, category-codes of what will be character tokens for the TeX-engine will not be taken into account.)
A mechanism which works out 100%-reliably in expansion-contexts also and which serves for detecting whether the next token in the token stream is a(n explicit) character-token of category code 1(beginning of group), probably of character-code 123 ({) ), and issuing only a tailored error-message (and nothing else) if this is not the case, requires 100%-reliable expandable look-ahead at the next token of the token-stream.
This is not possible with traditional TeX-engines.
Using {-delimited arguments via #{-notation may result in TeX-generated error-messages about things not matching definitions preceding/following your tailored error-message in case of no explicit {1 being present.
Methods based on grabbing ⟨general text⟩ tend either (\toks0=...} to be not expandable or (\scantokens etc ) to not preserve catcode-régime or (\uppercase/\lowercase) to not preserve character-codes. Besides this, with ⟨general text⟩ the left-brace-token before the ⟨balanced text⟩ can be explicit or implicit and expansion is not suppressed while scanning for the ⟨general text⟩'s left-brace-token.
Methods based on \@ifnextchar or \let or \futurelet are based on assignments and thus are not expandable. If expandability is not of interest, then e.g., using \futurelet, obeying its subtleties, you can have TeX look ahead at the meaning of the next token and if that denotes a catcode-1-token probably apply \string or \meaning before examination of (the character-code) of subsequent tokens by means of argument-processing macros before doing whatsoever trickery for re-inserting the stringified token under correct catcode-régime. Problems with distinguishing explicit character-tokens from control-symbol-tokens/single-letter-control-word-tokens in case of \escapechar currently having a negative value might occur. Problems with distinguishing explicit character-tokens from active pendants that are let equal to them might occur.
In your question you referred to Syntax of TeX for primitives that demand braces where with
\def\seq{abcdef}%
\uppercase\seq %
problems occur because while scanning for \upppercase's ⟨general text⟩'s left-brace-token expansion with \seq as "starting-point" does not yield a token-sequence beginning with ⟨filler⟩ trailed by a left-brace-token (which may be implicit or explicit), trailed by ⟨balanced text⟩ trailed by a ⟨right brace⟩ (which must be explicit).
While both expandably and 100%-reliably detecting whether the next token of the token-stream produced by TeX's mouth is, e.g., explicit {1 is not possible, it is possible to test in the stage of expansion, i.e., in TeX's gullet, if a set of tokens coming from an already grabbed macro argument (where outermost surrounding braces were already removed during grabbing) forms ⟨balanced text⟩ that is nested between explicit character-tokens of catcode 1/2:
% A TeX-engine is needed which brings along the \expanded-primitive.
\tt
\hyphenchar\font=`-\relax
\emergencystretch 3em
\frenchspacing
\parindent=0pt
\chardef\stopromannumeral=`^^00
\long\def\firstoftwo#1#2{#1}%
\long\def\secondoftwo#1#2{#2}%
%%-----------------------------------------------------------------------------
%% Check whether argument forms <balanced text> that is nested
%% between a pair of matching explicit catcode1/2-character-
%% tokens:
%%.............................................................................
%% \CheckWhetherNestedInExplicitBraces{<Argument which is to be checked>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is nested between
%% whatsoever explicit braces>}%
%% {<Tokens to be delivered in case that argument
%% which is to be checked is not nested between
%% whatsoever explicit braces>}%
\long\def\CheckWhetherNestedInExplicitBraces#1{%
\romannumeral\expandafter\secondoftwo\expandafter{\expandafter{\string#1.}%
\expandafter\firstoftwo\expandafter{\expandafter\secondoftwo\string}%
\expandafter\secondoftwo\string{\expandafter\expandafter\expandafter
\secondoftwo\expandafter\expandafter\expandafter{\expandafter\expandafter
\expandafter{\expandafter\string\firstoftwo{}#1}\expandafter\secondoftwo
\string}\expandafter\firstoftwo\expandafter{\expandafter\secondoftwo\string}%
\expandafter\stopromannumeral\secondoftwo}{\expandafter\stopromannumeral
\firstoftwo}}{\expandafter\stopromannumeral\secondoftwo}%
}%
\CheckWhetherNestedInExplicitBraces{A{B}C}{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{}{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{ }{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{{A}BC}{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{ABC}{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{{A}{B}{C}}{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{{ABC} }{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{ {ABC} }{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{ {ABC}}{Nested in explicit braces}{Not nested in explicit braces}%
\CheckWhetherNestedInExplicitBraces{{ABC}}{Nested in explicit braces}{Not nested in explicit braces}%
\noindent\hrulefill\null
\def\seq{{abcdef}}%
\expandafter\CheckWhetherNestedInExplicitBraces\expandafter{\expanded{\seq}}{%
\uppercase\seq
}{%
%\errmessage
{Here could be a customized error-message about things not being nested between
explicit brace tokens (although with \string\uppercase\space an implicit left
brace would do as well.)}%
%Or try one of the following:
%\uppercase\expandafter{\seq}%
%\uppercase\expandafter{\expanded{\seq}}%
}%
\noindent\hrulefill\null
\def\seq{abcdef}%
\expandafter\CheckWhetherNestedInExplicitBraces\expandafter{\expanded{\seq}}{%
\uppercase\seq
}{%
%\errmessage
{Here could be a customized error-message about things not being nested between
explicit brace tokens (although with \string\uppercase\space an implicit left
brace would do as well.)}%
%Or try one of the following:
%\uppercase\expandafter{\seq}%
%\uppercase\expandafter{\expanded{\seq}}%
}%
\bye

\@ifnextcharbut that's not expandable also if (as occurs in some documents F is catcode 1 and P is catode 2 then do you accept\frac F aP F b P– David Carlisle Oct 12 '21 at 13:18\frac12? A fatal error? Or should data be discarded until a brace is located? – Steven B. Segletes Oct 12 '21 at 13:40