Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.190.207.144] |
|
Сообщ.
#1
,
|
|
|
Здаствуйте, есть 2 проблемы с виндовыми контролами и исключениями генерируемых в них через метод Invoke
вот пример: private void Form1_Load (object sender, EventArgs e) { new Thread (delegate () { try { this.Invoke (new MethodInvoker (delegate () { try { throw null; } catch (Exception ex) { throw new MyException (ex); } })); } catch (Exception ex) { MessageBox.Show (ex.GetType ().FullName); } }).Start (); } public class MyException : Exception { public MyException (Exception innerException) : base ("", innerException) { } } 1 вопрос: MessageBox, утверждает, что сгенерировалось исключение NullReferencException, хотя я его перехватил, и обернул в своё исключение, которое потом и вызвал. Возникает вопрос, зачем при окончание метода Inkove, контрол спускается на самое нижнее исключение по InnerException, и вызывает его? И как собственно обойти это счатье, мне нужно перехватывать именно свои исключения. Сделал так public class MyException : Exception { public readonly new Exception InnerException; public MyException (Exception innerException) : base ("", null) { this.InnerException = innerException; } } Но это выглядит порнографией, есть ли нормальный способ? 2 вопрос: Рылся в тулсах, в отладке, но нинашел никаких настроек отключения этого счасться: В режиме дебага, отладчик постоянно останавливается на генерации исклюения, которые в методе Invoke не перехватывается, как это отключить? И в первом примере и тут, отладчик останавливается на строке "throw null;" Тоже самое и в консоли: internal static class Program { private static void Main () { ThreadStart method = new ThreadStart (delegate () { throw null; }); method.BeginInvoke (delegate (IAsyncResult ar) { try { method.EndInvoke (ar); } catch(Exception ex) { Console.WriteLine (ex.Message); } }, null); Console.ReadKey (); } } Зарание спасибо. |
Сообщ.
#2
,
|
|
|
TerraGhost, когда ты зовешь this.Invoke, ты вызываешь исключение не в твоем созданном потоке, а в потоке UI, и естественно оно не обрабатывается. Посмотри, я писал в FAQ об этом.
Вот так его можно поймать: Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.GetType().FullName); } |
Сообщ.
#3
,
|
|
|
Цитата TerraGhost @ - все верно, напиши вместо throw null; - throw new Exception(); и подумай почему все поменялось MessageBox, утверждает, что сгенерировалось исключение NullReferencException PS интернет пропадал |