<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Принцип работы try/catch]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=14704</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=14704&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Принцип работы try/catch».]]></description>
		<lastBuildDate>Wed, 10 Apr 2019 15:26:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133490#p133490</link>
			<description><![CDATA[<p><a href="http://forum.script-coding.com/viewtopic.php?id=11183">UrlDownloadToVar</a> - используется try/catch, если вашу ошибку не будет ловить, пишите в тему, улучшим функцию вместе.</p>]]></description>
			<author><![CDATA[null@example.com (stealzy)]]></author>
			<pubDate>Wed, 10 Apr 2019 15:26:36 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133490#p133490</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133480#p133480</link>
			<description><![CDATA[<p><strong>KusochekDobra</strong>, теперь я понял логику работы этих команд, спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (belyankin12)]]></author>
			<pubDate>Wed, 10 Apr 2019 10:25:39 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133480#p133480</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133479#p133479</link>
			<description><![CDATA[<p>Генерация исключения(Throw) — полезна, если Вы не знаете, в каком логическом окружении будет работать текущий участок кода, но Вы определённо знаете, что именно этот участок, требует определённого поведения для корректной работы. Как раз это и описано в реализации WinHttpRequest. В какой-то части кода предусмотрено получение ответа от сервера. Ответ не может быть ожидаем бесконечно, поэтому ожидается его получение согласно настройкам таймаутов и если в течение этого времени ответ не приходит, вызванный метод не может вернуть ожидаемый результат, в следствии чего, его код генерирует такое исключение, описывая само событие чтобы разработчик, использующий этот сторонний код, мог адекватно реагировать на ситуацию.</p><p>Сам метод вызываете Вы, из своего кода, значит вместо возвращаемого результата код получает сгенерированное вызванным методом исключение. Помимо этой ошибки, есть и другие. Например, когда соединение было внезапно потеряно, или возвращённый от сервера результат оказался нераспознанным. В каждом таком случае можно совершить ряд действий для продолжения работы программы перехватив исключение и получив информацию о том, что же его вызвало. Например, попытаться вновь совершить запрос, или обратиться к другому, запасному серверу за подобной информацией...</p><p>В Вашем случае, чтобы бесконечно ломиться на сервер в ожидании ответа, должно быть как-то так:<br /></p><div class="codebox"><pre><code>
if (!(result := Get(&quot;http://forum.script-coding.com&quot;).error)
	MsgBox % result
else
	MsgBox % &quot;Статус запроса = &quot; result.error &quot;`n&quot; result.req

Get(url) {
	oHTTP := ComObjCreate(&quot;WinHttp.WinHttpRequest.5.1&quot;)
	Try {
		oHTTP.Open(&quot;GET&quot;, url, false)
		oHTTP.Send()
		oHTTP.WaitForResponse()
	} Catch e {
		; 0x80072F78	Сервер вернул недопустимый или нераспознанный ответ
		; 0x80072EE2	Время ожидания операции истекло
		; 0x80072EFE	Соединение с сервером было неожиданно прервано
		OutputDebug % e.Message
		Return Get(url)
	} Return oHTTP.Status == 200 ? oHTTP.ResponseText : {&quot;error&quot;: oHTTP.Status, &quot;req&quot;: oHTTP.ResponseText}
}
</code></pre></div><p>И для отладки не особенно-сложных сценариев, используйте <a href="https://autohotkey.com/docs/commands/OutputDebug.htm">OutputDebug</a> совместно с <a href="https://docs.microsoft.com/ru-ru/sysinternals/downloads/debugview">DebugVew</a>. Это существенно упростит логгирование процесса без необходимости создания файла.</p>]]></description>
			<author><![CDATA[null@example.com (KusochekDobra)]]></author>
			<pubDate>Wed, 10 Apr 2019 09:06:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133479#p133479</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133478#p133478</link>
			<description><![CDATA[<p>Спасибо за ответы. Значит с этой конкретной проблемой лучше воспользоваться будет ComObjError.</p><p><strong>KusochekDobra</strong>, как я понял, мы помещает в try тот код, который может вызвать ошибку времени выполнения и если таковая случается, выполняется код в блоке catch, верно? Что в Вашем примере, что в справке, показаны команды Throw - она, скажем так, принудительно генерирует сообщение об ошибке? Ну например в том же HTTP запросе, если по завершению сценария в ResponseText ничего нет то это явно ошибка и в таком случае, чтобы вызвать блок catch я прописываю Throw в условии верно?</p>]]></description>
			<author><![CDATA[null@example.com (belyankin12)]]></author>
			<pubDate>Wed, 10 Apr 2019 07:17:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133478#p133478</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133471#p133471</link>
			<description><![CDATA[<div class="codebox"><pre><code>ComObjError(false) ;Вот эту строчку используй TRUE даст все вышедшие ошибки при подключению, false будет игнорировать
whr := ComObjCreate(&quot;WinHttp.WinHttpRequest.5.1&quot;) 
whr.Open(&quot;POST&quot;, &quot;URL&quot;, true) 
whr.SetRequestHeader(&quot;User-Agent&quot;, &quot;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36&quot;) 
whr.SetRequestHeader(&quot;Content-Type&quot;,&quot;application/x-www-form-urlencoded&quot;) 
whr.Send() 
whr.WaitForResponse() 
jsontext := % whr.ResponseText</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (wladkokopops)]]></author>
			<pubDate>Wed, 10 Apr 2019 04:40:02 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133471#p133471</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133467#p133467</link>
			<description><![CDATA[<p>Думаю, стоит подробней пояснить.<br />Try -&gt; Catch — предназначен для организации логики при возникновении ошибок, несовместимых с выполнением программы. Семантически, в блок &quot;Try {}&quot; помещается участок кода, который подозревается в генерации таких событий, а содержимое &quot;Catch {}&quot;, выполняет его перехват и обработку, если необходимо, для чего имеет связанную переменную, получающую &quot;состояние&quot; исключения, если оно документировано и может выполнить альтернативный алгоритм, чтобы попытаться осуществить предыдущую задачу похожим способом. &quot;Exception&quot; на Вашем скрине, сообщает, что &quot;Время ожидания операции истекло&quot;. Если Вы его перехватите в &quot;Catch e {}&quot;, &quot;e.Message&quot; будет содержать об этом пояснение.</p><p>В примере из справки показано, как по соглашению документированы исключения, чтобы их можно было не просто избегать, но так же строить логику с их участием. Exception() предоставляет для этого нативную возможность построения такого &quot;документирующего&quot; объекта, передаваемого в Throw. Так же их можно генерировать и &quot;документировать&quot; самому, не забыв при том, опубликовать их список и структуру, если собираетесь сделать фреймворк для пользования другими.<br /></p><div class="codebox"><pre><code>
try 
    SomeFunction()
catch e {
    MsgBox % &quot;Error in &quot; e.What &quot;, which was called at line &quot; e.Line &quot;`n&quot; e.Message
	Try {
		AnotherFunction()
		; Код, который не сможет быть выполнен
	} Catch e {
		MsgBox % Format(&quot;Перехвачено исключение типа &#039;{}&#039;, с результатом выполнения &#039;{}&#039;, сообщающее следующее:`n$$$ &#039;{}&#039; $$$&quot;, e.type, e.code, e.msg)
		; Остальная часть этого блока будет выполнена, если не сгенерирует новое исключение
	}
}

ExitApp

SomeFunction() {
    throw Exception(&quot;Fail&quot;, -1)
}
AnotherFunction() {
	throw {&quot;type&quot;: &quot;ФАТАЛ ЭРРОР!!!&quot;, &quot;code&quot;: 101, &quot;msg&quot;: &quot;Сушите вёсла, приехали!&quot;}
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (KusochekDobra)]]></author>
			<pubDate>Tue, 09 Apr 2019 22:08:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133467#p133467</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133466#p133466</link>
			<description><![CDATA[<p>Но только он завершает поток, что в большинстве случаев не подходит. То есть это удобная замена для &quot;Throw&quot;, а не для &quot;Try&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Tue, 09 Apr 2019 21:58:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133466#p133466</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133465#p133465</link>
			<description><![CDATA[<p>Согласен, удобная штука, никогда не использовал.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Tue, 09 Apr 2019 21:49:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133465#p133465</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133464#p133464</link>
			<description><![CDATA[<p>Может, OnError() проще будет.</p>]]></description>
			<author><![CDATA[null@example.com (svoboden)]]></author>
			<pubDate>Tue, 09 Apr 2019 21:44:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133464#p133464</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133463#p133463</link>
			<description><![CDATA[<div class="codebox"><pre><code>Try Gui, Show, wXXXX
Catch
	MsgBox Не правильно задан параметр</code></pre></div><p>Просто прописать &quot;Try&quot; перед строкой с возможной ошибкой.<br />Но в случае с ComObj лучше применить в начале скрипта ComObjError(false). Ошибки проверять по результатам функций. Будет непонятно где ошибка, проще закоментировать одну строку, чем удалять Try которые без Catch.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Tue, 09 Apr 2019 20:41:22 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133463#p133463</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Принцип работы try/catch]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=133461#p133461</link>
			<description><![CDATA[<p>Здравствуйте, товарищи. В своем скрипте я использую HTTP запросы и периодически (как я понял причиной является лаги компьютера или сервера к которому обращаюсь, в общем независящие от скриптера) метод Waitforresponse объекта WinHPPTRequest 5.1 выдает ошибку. <a href="http://prntscr.com/n9r7wj">Этот скриншот</a> лишь демонстрирует одну из них. Я не смог выявить закономерности появления ошибки потому мне трудно установить причину, однако мне крайне необходимо перехватить это событие, чтобы не выводить диалоговое окно об ошибке. В справке я наткнулся на команды try/catch, которые вроде бы могут мне помочь с этим, однако, мне ничерта не понятно ни с описания той команды, ни с примеров, приведенных в статье, из которых я увидел лишь демонстрацию вложенности этих операторов. Потому я прошу мне объяснить суть работы этих операторов, чтобы я смог их применить для перехвата ошибок в будущем.</p>]]></description>
			<author><![CDATA[null@example.com (belyankin12)]]></author>
			<pubDate>Tue, 09 Apr 2019 20:31:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=133461#p133461</guid>
		</item>
	</channel>
</rss>
