<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2736510</guid>
        <pubDate>Tue, 26 Oct 2010 22:28:29 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2736510</link>
        <description><![CDATA[CodeMonkey: JclHookExcept - это установка ловушки исключений. Возбуждается исключение - вызывается ваш код.<br>
JclDebug - это чтение отладочной информации. Хотите получать Form1.Button1Click вместо &#036;00456732 - юзаем модуль.<br>
<br>
Понятно, что отладочная информация из воздуха не берётся. Поэтому к JclDebug нужно приложить map-файл, TDS, или заюзать эксперт в IDE.<br>
<br>
<a class='tag-url' href='http://forum.vingrad.ru/forum/topic-235599.html' target='_blank'>Вникать</a>.]]></description>
        <author>CodeMonkey</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2735759</guid>
        <pubDate>Tue, 26 Oct 2010 09:06:55 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2735759</link>
        <description><![CDATA[blackswan: статья помогла, но тут вроде без JCLDebug это сделано, я могу отключить добавление JCL-debug информации в код?<br>достаточно оставить Map-detailed в свойствах проекта для получения стека вызовов(со строками вызова)?]]></description>
        <author>blackswan</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2735452</guid>
        <pubDate>Mon, 25 Oct 2010 19:28:47 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2735452</link>
        <description><![CDATA[CodeMonkey: В 13-й строке.<br>
<br>
Демо-проект выкладывайте.<br>
<br>
P.S. Кстати, материал этого топика обобщён в <a class='tag-url' href='http://www.gunsmoker.ru/2010/04/exception-delphi-2009.html' target='_blank'>этой статье</a>.]]></description>
        <author>CodeMonkey</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2735292</guid>
        <pubDate>Mon, 25 Oct 2010 14:51:52 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2735292</link>
        <description><![CDATA[blackswan: делал всё по этой статье http://rsdn.ru/article/Delphi/DelphiJCL.xml<br>также пробовал по другим источникам-примерам , по примерам из jcl<br>однако jcl-функции не хотят возвращать стек переходов, в частности функция JclGetExceptStackList, JclLastExceptStackList,JclLastExceptStackListToStrings возвращают nil, пусто<br>я проинициализировал механизм, включил в свойствах проекта все добавление JCL-debug data, однако ничего не изменилось<br>взял из примера experts&#092;debug&#092;dialog модуль ExceptDlgMail, который, по словам пользующихся, сам всё инициализирует, его надо только вызвать из приложения, однако в нём также<br>StackList := JclGetExceptStackList(FThreadID);<br>в TExceptionDialogMail.CreateReport;<br>возвращает nil<br>в чем может быть проблема?]]></description>
        <author>blackswan</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579590</guid>
        <pubDate>Tue, 27 Apr 2010 08:42:18 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579590</link>
        <description><![CDATA[Felan: Опять забыл &quot;вопрос решен&quot; поставить.]]></description>
        <author>Felan</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579584</guid>
        <pubDate>Tue, 27 Apr 2010 08:33:43 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579584</link>
        <description><![CDATA[CodeMonkey: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=301395&view=findpost&p=2579581'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Felan &#064; <time class="tag-quote__quoted-time" datetime="2010-04-27T08:32:01+00:00">27.04.10, 08:32</time></span><div class='quote '>Хотя, StackTrace все равно лучше брать у BaseException</div></div><br>
Чего, как и сколько граммов - это уже на ваше усмотрение :)]]></description>
        <author>CodeMonkey</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579581</guid>
        <pubDate>Tue, 27 Apr 2010 08:32:01 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579581</link>
        <description><![CDATA[Felan: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=301395&view=findpost&p=2579571'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>CodeMonkey &#064; <time class="tag-quote__quoted-time" datetime="2010-04-27T08:14:03+00:00">27.04.10, 08:14</time></span><div class='quote '>Представьте, что было бы, если бы это было не так. У вас возникает Out of memory и... вы начинаете строить стек вызовов, что приводит к... выделению памяти&#33; Упс. </div></div><br>
Кэп?&#33; ;)<br>
<br>
В общем понятно.<br>
<br>
Хотя, StackTrace все равно лучше брать у BaseException. Тогда в него попадают все функции, а если брать у внешнего, то только до той, в которой прозошло само внешнее исключение...<br>
<br>
<strong class='tag-b'>+</strong>]]></description>
        <author>Felan</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579571</guid>
        <pubDate>Tue, 27 Apr 2010 08:14:03 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579571</link>
        <description><![CDATA[CodeMonkey: :D <br>
<br>
Простым умственным упражнением несложно догадаться, что для наследников EHeapException (коим и является EOutOfMemory) стек вызовов не создаётся никогда. Эту догадку потом можно подтвердить по исходному коду.<br>
<br>
Почему? Представьте, что было бы, если бы это было не так. У вас возникает Out of memory и...  вы начинаете строить стек вызовов, что приводит к... выделению памяти&#33; Упс. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-04-27T08:14:54+00:00">27.04.10, 08:14</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=301395&view=findpost&p=2579529'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Felan &#064; <time class="tag-quote__quoted-time" datetime="2010-04-27T07:37:11+00:00">27.04.10, 07:37</time></span><div class='quote '>Вобщем понятно. Стектрейс надо брать всегда у BaseException... Почему так???</div></div><br>
Неверный вывод из данных фактов. Просто возьмите другой класс.]]></description>
        <author>CodeMonkey</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579529</guid>
        <pubDate>Tue, 27 Apr 2010 07:37:11 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579529</link>
        <description><![CDATA[Felan: Странно.<br>
<br>
Сделал вроде по написанному.<br>
<br>
Добавил модуль ExceptionJCLSupport, включил отладочую информацию...<br>
<br>
Далее для кнопки (из самого первого листинга, только модуль добавил):<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TfrmExcptionsTestMain.btnDivideByZeroClick( Sender: TObject );</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;***&#39; );</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;Деление на 0&#39; );</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;DividingByZero( );</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;on e: Exception do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.Message&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.Message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.ToString()&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.ToString() );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.StackTrace&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.StackTrace );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;==&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Стек есть, а для остальных нету.<br>
<br>
Не вижу никакой принципиальной разницы между ними... <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-04-27T07:56:05+00:00">27.04.10, 07:56</time></span></span><br>
В функции GetExceptionStackInfoJCL стек еще есть, а в GetStackInfoStringJCL уже нету... Info=nil <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-04-27T08:03:45+00:00">27.04.10, 08:03</time></span></span><br>
Тааааак....<br>
Нужный стектрейс лежит у вложенного исключения...<br>
<br>
Так и должно быть? Почему нет стектрейса у внешнего? Разве стектрей не общий для всей цепочки исключений? <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-04-27T08:11:30+00:00">27.04.10, 08:11</time></span></span><br>
Вобщем понятно. Стектрейс надо брать всегда у BaseException... Почему так???]]></description>
        <author>Felan</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579347</guid>
        <pubDate>Mon, 26 Apr 2010 21:11:41 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579347</link>
        <description><![CDATA[CodeMonkey: <a class='tag-url' href='http://gunsmoker.blogspot.com/2010/04/exception-delphi-2009.html' target='_blank'>Новый класс Exception в Delphi 2009 и выше</a>.]]></description>
        <author>CodeMonkey</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579273</guid>
        <pubDate>Mon, 26 Apr 2010 19:18:59 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579273</link>
        <description><![CDATA[CodeMonkey: Программа - это набор машинных команд, т.е. чисел. По-умолчанию, в программе нет никакого текста программы. Поэтому, построить стек штатными средствами - невозможно.<br>
<br>
Нужно использовать стороннее решение, которое делает следующее:<ul class="tag-list"><li>Добавляет в скомпилированный модуль отладочную информацию (соответствие машинных инструкций тексту программы) в общеизвестном или приватном формате. Чаще всего, она добавляется как ресурс RC_DATA или секция PE.</li><li>Устанавливает hook на возникновение исключений (на какую-либо функцию, которая вызывается всегда при возникновении исключений. Например, RaiseException из Kernel32). Обычно это патчинг чего-либо (таблицы импорта или секции кода).</li><li>В ловушке исключений строит стек, используя какой-либо алгоритм трассировки стека, вручную проходясь по машинному стеку и вылавливая из него адреса вызовов функций. Вы также можете использовать Майкросовтовский Debug Help API.</li></ul><br>
Если первый и последний пункт представляют собой красивое и документированное решение, то пункт два - это грязные хаки. Поэтому, чтобы упростить нам жизнь, разработчики Delphi добавили архитектуру поддержки трейсеров исключений (немного поздно, но лучше поздно, чем никогда). Всё, что она делает - позволяет вам вызвать свою процедуру в момент возникновения исключения, убирая необходимость в ручном патчинге. Ничего больше она не делает.<br>
<br>
Иными словами, это возможность предназначена для разработчиков трейсеров исключений. Есть мнение, что она была добавлена в Delphi в преддверие перехода на Mac OS и Linux с целью унификации кода. <br>
<br>
Поскольку уже написанные трейсеры исключений не используют эту возможность (да и не могут её использовать, потому что они работают и в тех версиях Delphi, где её нет), то вам надо использовать их возможности по получению стека вызовов. Например, для JCL это будет вызов JclLastExceptStackList, а для EurekaLog - GetLastExceptionCallStack.<br>
<br>
Однако, вы можете интегрировать любой существующий трейсер (или написать свой) в эту новую архитектуру. Если написание своего - это достаточно сложная задача, то интегрировать уже существующий - это дело пары минут. Если при этом трейсер чётко состоит из нескольких частей, то, интегрировав его в эту архитектуру, вы можете не подключать ту его часть, которая ответственна за хуки.<br>
<br>
Итак, если вы решили, что вам это надо, то вот краткое описание с примером для джедаев.<br>
<br>
Во-первых, надо понимать, что вышеуказанная поддержка касается двух модулей - System и SysUtils. Как и с другими возможностями по исключениям, весь базовый функционал заключён в модуле System. Модуль SysUtils является лишь удобной обёрткой к System. Для этого System выставляет наружу некоторые события (ExceptProc, ErrorProc, ExceptClsProc, ExceptObjProc, RaiseExceptionProc, RTLUnwindProc, RaiseExceptObjProc, ExceptionAcquired, ExceptionClass, SafeCallErrorProc, AssertErrorProc и AbstractErrorProc), которые и использует модуль SysUtils. Вам не следует использовать их напрямую, если только <a class='tag-url' href='http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=833' target='_blank'>вы не отказались от модуля SysUtils</a>. Вместо использования событий модуля System, вы используете модуль SysUtils.<br>
<br>
Итак, что же тогда нам предлагает модуль SysUtils? А модуль SysUtils предлагает нам новый класс Exception, в котором появились события GetExceptionStackInfoProc, GetStackInfoStringProc и CleanUpStackInfoProc. По-умолчанию, они не назначены - да и их некому реализовывать, т.к., как я уже сказал, в программе по-умолчанию просто нет информации для этого.<br>
<br>
Значит, нам надо их реализовать. Поскольку мы пишем просто обёртку к уже существующему трейсеру, то всё, что нам надо будет сделать - вызвать подходящую функцию трейсера. Например:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit ExceptionJCLSupport;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;SysUtils, Classes, JclDebug;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetExceptionStackInfoJCL(P: PExceptionRecord): Pointer;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;cDelphiException = {text}EEDFADE;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Stack: TJclStackInfoList;</div><div class="code_line">&nbsp;&nbsp;Str: TStringList;</div><div class="code_line">&nbsp;&nbsp;Trace: String;</div><div class="code_line">&nbsp;&nbsp;Sz: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if P^.ExceptionCode = cDelphiException then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Stack := JclCreateStackList(False, 3, P^.ExceptAddr)</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Stack := JclCreateStackList(False, 3, P^.ExceptionAddress);</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;Str := TStringList.Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Stack.AddToStrings(Str, True, True, True, True);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Trace := Str.Text;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeAndNil(Str);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;FreeAndNil(Stack);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if Trace &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Sz := (Length(Trace) + 1) * SizeOf(Char);</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(Result, Sz);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Move(Pointer(Trace)^, Result^, Sz);</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := nil;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetStackInfoStringJCL(Info: Pointer): string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := PChar(Info);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure CleanUpStackInfoJCL(Info: Pointer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FreeMem(Info);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">initialization</div><div class="code_line">&nbsp;&nbsp;Exception.GetExceptionStackInfoProc := GetExceptionStackInfoJCL;</div><div class="code_line">&nbsp;&nbsp;Exception.GetStackInfoStringProc := GetStackInfoStringJCL;</div><div class="code_line">&nbsp;&nbsp;Exception.CleanUpStackInfoProc := CleanUpStackInfoJCL;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
Достаточно добавить этот модуль в uses (чем раньше - тем лучще) и вы волшебным образом получаете свой стек:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Msg: String;</div><div class="code_line">&nbsp;&nbsp;SubE: Exception;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Msg := E.Message;</div><div class="code_line">&nbsp;&nbsp;while True do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;SubE := E.GetBaseException;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if SubE &#60;&#62; E then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;E := SubE;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if E.Message &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Msg := E.Message;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Break;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;if (Msg &#60;&#62; &#39;&#39;) and (Msg[Length(Msg)] &#62; &#39;.&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Msg := Msg + &#39;.&#39;;</div><div class="code_line">&nbsp;&nbsp;if E.StackTrace &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Msg := Msg + sLineBreak + sLineBreak + E.StackTrace;</div><div class="code_line">&nbsp;&nbsp;Application.MessageBox(PChar(Msg), PChar(Application.Title), MB_OK + MB_ICONSTOP);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Обратите внимание, что в этом примере не используется только хукинг исключений средствами JCL (JclHookExcept). Всё работает и без него. Мы используем только возможности JCL по чтению отладочной информации и трасировке стека. <br>
<br>
Аналогичный модуль для EurekaLog:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit ExceptionEurekaLogSupport;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;SysUtils, Classes, ExceptionLog;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetExceptionStackInfoEurekaLog(P: PExceptionRecord): Pointer;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;cDelphiException = {text}EEDFADE;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Stack: TEurekaStackList;</div><div class="code_line">&nbsp;&nbsp;Str: TStringList;</div><div class="code_line">&nbsp;&nbsp;Trace: String;</div><div class="code_line">&nbsp;&nbsp;Sz: Integer;</div><div class="code_line">&nbsp;&nbsp;DI: PEurekaDebugInfo;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Stack := GetCurrentCallStack;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;New(DI);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DI^.ModuleInfo := ModuleInfoByAddr(Cardinal(P^.ExceptAddr));</div><div class="code_line">&nbsp;&nbsp; &nbsp;if P^.ExceptionCode = cDelphiException then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GetSourceInfoByAddr(Cardinal(P^.ExceptAddr), DI)</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;GetSourceInfoByAddr(Cardinal(P^.ExceptionAddress), DI);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Stack.Insert(0, DI);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Str := TStringList.Create;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;CallStackToStrings(Stack, Str);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Trace := Str.Text;</div><div class="code_line">&nbsp;&nbsp; &nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;FreeAndNil(Str);</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; &nbsp;FreeAndNil(Stack);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if Trace &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Sz := (Length(Trace) + 1) * SizeOf(Char);</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetMem(Result, Sz);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Move(Pointer(Trace)^, Result^, Sz);</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp;Result := nil;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function GetStackInfoStringEurekaLog(Info: Pointer): string;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := PChar(Info);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure CleanUpStackInfoEurekaLog(Info: Pointer);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;FreeMem(Info);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">initialization</div><div class="code_line">&nbsp;&nbsp;Exception.GetExceptionStackInfoProc := GetExceptionStackInfoEurekaLog;</div><div class="code_line">&nbsp;&nbsp;Exception.GetStackInfoStringProc := GetStackInfoStringEurekaLog;</div><div class="code_line">&nbsp;&nbsp;Exception.CleanUpStackInfoProc := CleanUpStackInfoEurekaLog;</div><div class="code_line">end.</div></ol></div></div></div></div> <br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=301395&view=findpost&p=2579155'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Felan &#064; <time class="tag-quote__quoted-time" datetime="2010-04-26T15:50:59+00:00">26.04.10, 15:50</time></span><div class='quote '>Как в своей процедуре, которой можно заместить RaiseExceptObjProc, можно установить FAcquireInnerException, если это поле private?</div></div><br>
AcquireInnerException нельзя менять самому - только хаками. Понятия не имею, зачем это было сделано. Например:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit ChainedExceptionsAlways;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">uses</div><div class="code_line">&nbsp;&nbsp;SysUtils;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;OldRaiseExceptObject: Pointer;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;EExceptionHack = class</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; &nbsp;FMessage: string;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FHelpContext: Integer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FInnerException: Exception;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FStackInfo: Pointer;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FAcquireInnerException: Boolean;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure RaiseExceptObject(P: PExceptionRecord);</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TRaiseExceptObjectProc = procedure(P: PExceptionRecord);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;if TObject(P^.ExceptObject) is Exception then</div><div class="code_line">&nbsp;&nbsp; &nbsp;EExceptionHack(P^.ExceptObject).FAcquireInnerException := True;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if Assigned(OldRaiseExceptObject) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;TRaiseExceptObjectProc(OldRaiseExceptObject)(P);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">initialization</div><div class="code_line">&nbsp;&nbsp;OldRaiseExceptObject := RaiseExceptObjProc;</div><div class="code_line">&nbsp;&nbsp;RaiseExceptObjProc := @RaiseExceptObject;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
Примечание: обработчик по-умолчанию всегда показывает только самое вложенное исключение. Возможно, вы захотите использовать что-то вроде:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Msg: String;</div><div class="code_line">&nbsp;&nbsp;SubE: Exception;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Msg := E.Message;</div><div class="code_line">&nbsp;&nbsp;if (Msg &#60;&#62; &#39;&#39;) and (Msg[Length(Msg)] &#62; &#39;.&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Msg := Msg + &#39;.&#39;;</div><div class="code_line">&nbsp;&nbsp;if E.StackTrace &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp;Msg := Msg + sLineBreak + sLineBreak + E.StackTrace;</div><div class="code_line">&nbsp;&nbsp;while True do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;SubE := E.GetBaseException;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if SubE &#60;&#62; E then</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;E := SubE;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if E.Message &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Msg := Msg + sLineBreak + sLineBreak + E.Message;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (Msg &#60;&#62; &#39;&#39;) and (Msg[Length(Msg)] &#62; &#39;.&#39;) then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Msg := Msg + &#39;.&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if E.StackTrace &#60;&#62; &#39;&#39; then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Msg := Msg + sLineBreak + sLineBreak + E.StackTrace;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Break;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;Application.MessageBox(PChar(Msg), PChar(Application.Title), MB_OK + MB_ICONSTOP);</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Тогда такой код:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;PInteger(nil)^ := 0;</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;raise Exception.Create(&#39;Error occured&#39;);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
покажет (с подключенным ExceptionJCLSupport):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Error occured.</div><div class="code_line">&nbsp;</div><div class="code_line">(000A7DB7){Project68.exe} [004A8DB7] Unit67.TForm67.Button1Click (Line 64, &quot;Unit67.pas&quot; + 4) + </div><div class="code_line">(00004901){Project68.exe} [00405901] System.@RaiseExcept (Line 12194, &quot;System.pas&quot; + 47) + {text}</div><div class="code_line">(00076473){Project68.exe} [00477473] Controls.TControl.Click (Line 7178, &quot;Controls.pas&quot; + 9) + </div><div class="code_line">(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, &quot;Controls.pas&quot; + 144) + </div><div class="code_line">(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, &quot;StdCtrls.pas&quot; + 13) + </div><div class="code_line">(0007A91F){Project68.exe} [0047B91F] Controls.DoControlMsg (Line 9888, &quot;Controls.pas&quot; + 12) + </div><div class="code_line">(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, &quot;Controls.pas&quot; + 144) + </div><div class="code_line">(0009AC94){Project68.exe} [0049BC94] Forms.TCustomForm.WndProc (Line 3960, &quot;Forms.pas&quot; + 191) + </div><div class="code_line">(00079E6C){Project68.exe} [0047AE6C] Controls.TWinControl.MainWndProc (Line 9540, &quot;Controls.pas&quot; + 3) + </div><div class="code_line">(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, &quot;Classes.pas&quot; + 8) + {text}</div><div class="code_line">(0007A8CC){Project68.exe} [0047B8CC] Controls.TWinControl.DefaultHandler (Line 9860, &quot;Controls.pas&quot; + 30) + </div><div class="code_line">(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, &quot;Controls.pas&quot; + 144) + </div><div class="code_line">(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, &quot;StdCtrls.pas&quot; + 13) + </div><div class="code_line">(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, &quot;Classes.pas&quot; + 8) + {text}</div><div class="code_line">&nbsp;</div><div class="code_line">Access violation at address 004A8D90 in module &#39;Project68.exe&#39;. Write of address 00000000.</div><div class="code_line">&nbsp;</div><div class="code_line">(000A7D90){Project68.exe} [004A8D90] Unit67.TForm67.Button1Click (Line 62, &quot;Unit67.pas&quot; + 2) + </div><div class="code_line">(0000453F){Project68.exe} [0040553F] System.@HandleAnyException (Line 11245, &quot;System.pas&quot; + 13) + {text}</div><div class="code_line">(00076473){Project68.exe} [00477473] Controls.TControl.Click (Line 7178, &quot;Controls.pas&quot; + 9) + </div><div class="code_line">(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, &quot;Controls.pas&quot; + 144) + </div><div class="code_line">(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, &quot;StdCtrls.pas&quot; + 13) + </div><div class="code_line">(0007A91F){Project68.exe} [0047B91F] Controls.DoControlMsg (Line 9888, &quot;Controls.pas&quot; + 12) + </div><div class="code_line">(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, &quot;Controls.pas&quot; + 144) + </div><div class="code_line">(0009AC94){Project68.exe} [0049BC94] Forms.TCustomForm.WndProc (Line 3960, &quot;Forms.pas&quot; + 191) + </div><div class="code_line">(00079E6C){Project68.exe} [0047AE6C] Controls.TWinControl.MainWndProc (Line 9540, &quot;Controls.pas&quot; + 3) + </div><div class="code_line">(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, &quot;Classes.pas&quot; + 8) + {text}</div><div class="code_line">(0007A8CC){Project68.exe} [0047B8CC] Controls.TWinControl.DefaultHandler (Line 9860, &quot;Controls.pas&quot; + 30) + </div><div class="code_line">(0007A7CC){Project68.exe} [0047B7CC] Controls.TWinControl.WndProc (Line 9819, &quot;Controls.pas&quot; + 144) + </div><div class="code_line">(00057BE4){Project68.exe} [00458BE4] StdCtrls.TButtonControl.WndProc (Line 4377, &quot;StdCtrls.pas&quot; + 13) + </div><div class="code_line">(0003DC58){Project68.exe} [0043EC58] Classes.StdWndProc (Line 13014, &quot;Classes.pas&quot; + 8) + {text}</div></ol></div></div></div></div>]]></description>
        <author>CodeMonkey</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579155</guid>
        <pubDate>Mon, 26 Apr 2010 15:50:59 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2579155</link>
        <description><![CDATA[Felan: Что-то я не понял, а где взять эти обработчики?<br>
Их надо самому писать? (Есть ли пример какой-нибудь?)<br>
Или они где-то уже есть их надо просто подключить? (Где искать?) <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-04-26T16:02:49+00:00">26.04.10, 16:02</time></span></span><br>
Собственно вот цитата из пункта 1.2.4 твоей статьи:<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>ц). (только D2009 и выше) RaiseExceptObjProc: Pointer; // procedure(P: PExceptionRecord);<br>
Хук возбуждения исключений. Вызывается непосредственно перед вызовом<br>
RaiseExceptionProc. По-умолчанию равен nil. Модуль SysUtils устанавливает такой<br>
обработчик (вызывает уведомление RaisingException, которое создаёт стек вызовов и<br>
сохраняет вложенное исключение):<br>
procedure RaiseExceptObject(P: PExceptionRecord);<br>
begin<br>
if TObject(P.ExceptObject) is Exception then<br>
Exception(P.ExceptObject).RaisingException(P);<br>
end;</div></div><br>
<br>
Я правильно понимаю, что SysUtils устанавливает обработчик, который должен создать стек? Или это не тот стек? Или он не ставит? <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-04-26T16:12:26+00:00">26.04.10, 16:12</time></span></span><br>
И еще, в догонку...<br>
<br>
Как в своей процедуре, которой можно заместить RaiseExceptObjProc, можно установить FAcquireInnerException, если это поле private?<br>
<br>
Че-то каша какая-то у меня получается...]]></description>
        <author>Felan</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2576919</guid>
        <pubDate>Fri, 23 Apr 2010 12:04:10 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2576919</link>
        <description><![CDATA[CodeMonkey: В Delphi есть поддержка стека вызовов, но нет самого механизма. Т.е. это просто архитектура поддержки для сторонних решений. Потому что нельзя сделать общее решение.<br>
<br>
Для того, чтобы стек вызовов появился, вам нужно встроить какой-либо механизм. JCL, EurekaLog, madExcept, etc.<br>
<br>
Делается это установкой событий-обработчиков класса Exception. <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2010-04-23T12:07:11+00:00">23.04.10, 12:07</time></span></span><br>
А конкретно: Exception.GetExceptionStackInfoProc, Exception.GetStackInfoStringProc, Exception.CleanUpStackInfoProc.]]></description>
        <author>CodeMonkey</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2576886</guid>
        <pubDate>Fri, 23 Apr 2010 11:52:23 +0000</pubDate>
        <title>Почему в D2010 свойство StackTrace пустое?</title>
        <link>https://forum.sources.ru/index.php?showtopic=301395&amp;view=findpost&amp;p=2576886</link>
        <description><![CDATA[Felan: Сабж?<br>
<br>
Вот такой вот тестовый пример сделал... <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit ExcptionsTestMainFrm;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TfrmExcptionsTestMain = class( TForm )</div><div class="code_line">&nbsp;&nbsp; &nbsp;btnDivideByZero: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memLog: TMemo;</div><div class="code_line">&nbsp;&nbsp; &nbsp;btnClearLog: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;btnOutofMem: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;btnOutofMem2: TButton;</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure btnClearLogClick( Sender: TObject );</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure btnDivideByZeroClick( Sender: TObject );</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure btnOutofMemClick(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;procedure btnOutofMem2Click(Sender: TObject);</div><div class="code_line">&nbsp;&nbsp; &nbsp;private</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;procedure DividingByZero( );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;procedure OutOfMemory( );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;procedure OutOfMemory2();</div><div class="code_line">&nbsp;&nbsp; &nbsp;public</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;frmExcptionsTestMain: TfrmExcptionsTestMain;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">{$R *.dfm}</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmExcptionsTestMain.btnClearLogClick( Sender: TObject );</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;memLog.Clear( );</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmExcptionsTestMain.btnDivideByZeroClick( Sender: TObject );</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;***&#39; );</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;Деление на 0&#39; );</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;DividingByZero( );</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;on e: Exception do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.Message&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.Message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.ToString()&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.ToString() );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.StackTrace&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.StackTrace );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;==&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmExcptionsTestMain.btnOutofMem2Click(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;***&#39; );</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;Недостаточно памяти 2 (Деление на 0)&#39; );</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;OutOfMemory2( );</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;on e: Exception do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.Message&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.Message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.ToString()&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.ToString() );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.StackTrace&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.StackTrace );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;==&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmExcptionsTestMain.btnOutofMemClick(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;***&#39; );</div><div class="code_line">&nbsp;&nbsp;memLog.Lines.Add( &#39;Недостаточно памяти (Деление на 0)&#39; );</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;OutOfMemory( );</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;on e: Exception do</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.Message&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.Message );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.ToString()&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.ToString() );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;== e.StackTrace&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( e.StackTrace );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;==&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memLog.Lines.Add( &#39;&#39; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmExcptionsTestMain.DividingByZero;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;raise EDivByZero.Create( EDivByZero.ClassName );</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmExcptionsTestMain.OutOfMemory;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;DividingByZero();</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;raise EOutOfMemory.Create( EOutOfMemory.ClassName );</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TfrmExcptionsTestMain.OutOfMemory2;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp; &nbsp;DividingByZero();</div><div class="code_line">&nbsp;&nbsp;except</div><div class="code_line">&nbsp;&nbsp; &nbsp;Exception.RaiseOuterException( EOutOfMemory.Create( EOutOfMemory.ClassName ) );</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><br>
<br>
Как и положено в первом случае для аутофмемори никаких внутренних сключений нет... а во стором есть... А вот как добыть стэктрейс?]]></description>
        <author>Felan</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	