﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Создание роботов с помощью S#. Часть 1. Обработка исключений</title>
  <id>~/topic/359/sozdanie-robotov-s-pomoshshyu-s_-chast-1_-obrabotka-isklyuchenii/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-17T01:09:53Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=359" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/133/</id>
    <title type="text">Самое главное в роботе — это обработка исключений. У нас в роботе могут быть запущено множество разл...</title>
    <published>2012-03-18T21:58:32Z</published>
    <updated>2012-12-17T15:07:06Z</updated>
    <author>
      <name>FinDirector</name>
      <uri>https://stocksharp.com/users/473/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Самое главное в роботе — это обработка исключений. У нас в роботе могут быть запущено множество различных стратегий, и исключение в одном из роботов или ошибка в UI потоке не должны приводить к падению всей программы. Тем не менее именно такое поведение характерно по умолчанию для .NET программы.&lt;br /&gt;Далее считаем, что наш робот является WPF – приложением! В качестве теста используем следующий код:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
		private void Window_Loaded(object sender, RoutedEventArgs e)
		{
			Task.Factory.StartNew(ThrowException);
			ThrowException();
		}

		void ThrowException()
		{
			throw new Exception(&amp;quot;ops!&amp;quot;);
		}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Вначале мы кидаем исключение в отдельном потоке (а в стратегиях события могут вызываться асинхронно), а затем в UI потоке.  Приложение упадет. Чтобы это исправить, необходимо сделать следующие правки. &lt;br /&gt;В файле App.xaml.cs написать:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:csharp"&gt;
		protected override void OnStartup(StartupEventArgs e)
		{
			base.OnStartup(e);

#if (DEBUG != true)
			// Don&amp;#39;t handle the exceptions in Debug mode because otherwise the Debugger wouldn&amp;#39;t
			// jump into the code when an exception occurs.
			DispatcherUnhandledException += AppDispatcherUnhandledException;
			AppDomain.CurrentDomain.UnhandledException += AppDomainUnhandledException;
#endif
		}

		private void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
		{
			HandleException(e.Exception, false);
			e.Handled = true;
		}

		private static void AppDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
		{
			HandleException(e.ExceptionObject as Exception, e.IsTerminating);
		}

		private static void HandleException(Exception e, bool isTerminating)
		{
			if (e == null) return;

			Trace.TraceError(e.ToString());

			if (!isTerminating)
			{
				MessageBox.Show(string.Format(CultureInfo.CurrentCulture, &amp;quot;Неизвестная ошибка: {0}&amp;quot;, e.ToString()),
					&amp;quot;FinDirector&amp;quot;, MessageBoxButton.OK, MessageBoxImage.Error);
			}
		}&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Тем не менее, это не спасет от крэша наше приложение при необработанных исключениях не в UI потоке. В файл app.confg необходимо добавить строки:&lt;br /&gt;&lt;div class="code"&gt;&lt;strong&gt;Code&lt;/strong&gt;&lt;div class="innercode"&gt;&lt;pre class="brush:xml"&gt;
&amp;lt;runtime&amp;gt;
    &amp;lt;legacyUnhandledExceptionPolicy enabled=&amp;quot;1&amp;quot; /&amp;gt;
  &amp;lt;/runtime&amp;gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Теперь:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;приложение не будет падать при не критических исключениях (таких как OutOfMemory, StackOverflow);&lt;br /&gt;&lt;li&gt;мы получим сообщение об ошибке, а не проглотим его.&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:120%"&gt;&lt;div align="right"&gt;&lt;b&gt;Автор статьи — Вадим Чижов&lt;/b&gt;&lt;/div&gt;&lt;/span&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>