Я полагаю, что понимаю проблему. Исключение поймано, проблемой является беспорядок по поведению отладчика и различиям в настройках отладчика среди каждого человека, пробующего к репродукции оно.
В 3-м случае от Вашей репродукции я полагаю, что Вы получаете следующее сообщение: "NoViableAltException был не обработан пользовательским кодом" и стеком вызовов, который похож на это:
[External Code] > TestAntlr-3.1.exe!TimeDefLexer.mTokens() Line 852 + 0xe bytes C# [External Code] TestAntlr-3.1.exe!TimeDefParser.prog() Line 141 + 0x14 bytes C# TestAntlr-3.1.exe!TestAntlr_3._1.Program.ParseTest(string Text = "foobar;") Line 49 + 0x9 bytes C# TestAntlr-3.1.exe!TestAntlr_3._1.Program.Main(string[] args = {string[0x00000000]}) Line 30 + 0xb bytes C# [External Code]
, Если Вы щелкаете правой кнопкой в окне стека вызовов и выполняете поворот выставленный внешний код, Вы видите это:
Antlr3.Runtime.dll!Antlr.Runtime.DFA.NoViableAlt(int s = 0x00000000, Antlr.Runtime.IIntStream input = {Antlr.Runtime.ANTLRStringStream}) + 0x80 bytes Antlr3.Runtime.dll!Antlr.Runtime.DFA.Predict(Antlr.Runtime.IIntStream input = {Antlr.Runtime.ANTLRStringStream}) + 0x21e bytes > TestAntlr-3.1.exe!TimeDefLexer.mTokens() Line 852 + 0xe bytes C# Antlr3.Runtime.dll!Antlr.Runtime.Lexer.NextToken() + 0xc4 bytes Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.FillBuffer() + 0x147 bytes Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.LT(int k = 0x00000001) + 0x2d bytes TestAntlr-3.1.exe!TimeDefParser.prog() Line 141 + 0x14 bytes C# TestAntlr-3.1.exe!TestAntlr_3._1.Program.ParseTest(string Text = "foobar;") Line 49 + 0x9 bytes C# TestAntlr-3.1.exe!TestAntlr_3._1.Program.Main(string[] args = {string[0x00000000]}) Line 30 + 0xb bytes C# [Native to Managed Transition] [Managed to Native Transition] mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x39 bytes Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x2b bytes mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x3b bytes mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x81 bytes mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x40 bytes
сообщение отладчика говорит Вам, что возникновение исключения вне Вашего кода (от NoViableAlt) проходит код, которым Вы владеете в TestAntlr-3.1.exe! TimeDefLexer.mTokens () без того, чтобы быть обработанным.
формулировка сбивает с толку, но это не означает, что исключение не поймано. Отладчик сообщает, что кодируют Вас, владеют mTokens ()", должно быть устойчивым против этого исключения, бросаемого через него.
Вещи играть с видеть, как это ищет тех, кто не сделал репродукции проблема:
Могу ли я использовать какой-то контролируемый мной элемент управления? Например, рекомендуется ли использовать кнопку и стилизовать ее так, чтобы она не выглядела как кнопка?
Да. Самый простой подход - изменить шаблон кнопки, чтобы она действовала как TextBlock, и задействовать свойство команды в классе кнопки.
Что-то вроде этого:
<ControlTemplate TargetType="Button">
<TextBlock Text="{TemplateBinding Content}" />
</ControlTemplate>
...
<Button Content="Foo" Command="{Binding Bar}" />