<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_10_thread_43127"  />
<title>rulinux.net - Форум - Talks - Exception</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Talks - Exception</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222595</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222595</guid>
<pubDate>Mon, 19 Mar 2018 05:10:33 +0300</pubDate>
<description><![CDATA[<p>Заменять exception на NULL -- явно неудачная идея.<br><br>Вот как я отлавливаю ошибки в своем загрузчике картинок с голыми девками с борд:<br><br><fieldset><legend>lisp</legend><div class="highlight lisp"><br />
<span class="br0">&#40;</span><span class="kw1">defun</span> download-images<span class="sy0">%</span> <span class="br0">&#40;</span>uri directory<span class="br0">&#41;</span><br />
&nbsp; <span class="st0">&quot;Download images from a thread (without error handling)&quot;</span><br />
&nbsp; <span class="br0">&#40;</span>with-simple-restart <span class="br0">&#40;</span>thread-skip <span class="st0">&quot;Skip downloading this thread&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">let</span>* <span class="br0">&#40;</span><span class="br0">&#40;</span>thread <span class="br0">&#40;</span>make-thread uri<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>pathname <span class="br0">&#40;</span>get-directory-pathname directory <span class="br0">&#40;</span>directory-<span class="kw1">name</span> thread<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>files <span class="br0">&#40;</span>remove-extensions <span class="br0">&#40;</span>image-sources thread<span class="br0">&#41;</span> *ignored-extensions*<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>ensure-directories-exist pathname<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>format t <span class="st0">&quot;Downloading total of ~d images~%&quot;</span> <span class="br0">&#40;</span><span class="kw1">length</span> files<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">mapc</span> <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>file<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>format t <span class="st0">&quot;.&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>force-output<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>destructuring-bind <span class="br0">&#40;</span>uri <span class="sy0">.</span> <span class="kw1">name</span><span class="br0">&#41;</span> file<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>file-path <span class="br0">&#40;</span>merge-pathnames <span class="kw1">name</span> pathname<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>tagbody retry<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>restart-<span class="kw1">case</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">not</span> <span class="br0">&#40;</span>open file-path <span class="sy0">:</span><span class="me1">direction</span> <span class="sy0">:</span><span class="me1">probe</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>data <span class="br0">&#40;</span>make-request uri<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>with-open-file <span class="br0">&#40;</span>output file-path<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">:</span><span class="me1">direction</span> <span class="sy0">:</span><span class="me1">output</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">:</span><span class="me1">if-does-not-exist</span> <span class="sy0">:</span><span class="me1">create</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">:</span><span class="me1">element-type</span> '<span class="br0">&#40;</span>unsigned-byte <span class="nu0">8</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>write-sequence data output<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>file-skip <span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">:</span><span class="me1">report</span> <span class="st0">&quot;Skip downloading file&quot;</span> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>file-retry <span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="sy0">:</span><span class="me1">report</span> <span class="st0">&quot;Retry downloading file&quot;</span> <span class="br0">&#40;</span><span class="kw1">go</span> retry<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; files<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#40;</span>format t <span class="st0">&quot;~%&quot;</span><span class="br0">&#41;</span><br />
&nbsp; t<span class="br0">&#41;</span><br />
<br />
<span class="br0">&#40;</span><span class="kw1">defun</span> try-restarts <span class="br0">&#40;</span>restarts<span class="br0">&#41;</span><br />
&nbsp; <span class="st0">&quot;Invoke the first available restart from list&quot;</span><br />
&nbsp; <span class="br0">&#40;</span><span class="kw1">mapc</span> <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>restart<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>find-restart restart<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>invoke-restart restart<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; restarts<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<br />
<span class="br0">&#40;</span><span class="kw1">defun</span> handle-conditions <span class="br0">&#40;</span>condition<span class="br0">&#41;</span><br />
&nbsp; <span class="st0">&quot;Handle conditions automatically or fall back to the debugger&quot;</span><br />
&nbsp; <span class="br0">&#40;</span><span class="kw1">princ</span> condition *error-output*<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#40;</span>terpri *error-output*<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#40;</span>force-output *error-output*<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#40;</span>typecase condition<br />
&nbsp; &nbsp; <span class="br0">&#40;</span>unknown-resource<br />
&nbsp; &nbsp; &nbsp;<span class="co1">;; Skip the thread and continue with a new one</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>invoke-restart 'thread-skip<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">or</span> bad-response-code usocket<span class="sy0">:</span><span class="me1">timeout-</span><span class="kw1">error</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span class="co1">;; Try to skip a file first</span><br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>try-restarts '<span class="br0">&#40;</span>file-skip thread-skip<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<br />
<span class="br0">&#40;</span><span class="kw1">defun</span> download-images <span class="br0">&#40;</span>uri directory<span class="br0">&#41;</span><br />
&nbsp; <span class="st0">&quot;Download images from a thread. URI is a desired resource WWW address.<br />
&nbsp;All files will be saved to DIRECTORY + some guessed name, based on the<br />
&nbsp;name of the thread or URI.&quot;</span><br />
&nbsp; <span class="br0">&#40;</span>handler-bind<br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw1">or</span> file-<span class="kw1">error</span> usocket<span class="sy0">:</span><span class="me1">socket-</span><span class="kw1">error</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; image-downloader-<span class="kw1">error</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; #'handle-conditions<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span>download-images<span class="sy0">%</span> uri directory<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp;</div></fieldset><br><br>Ошибки возникают внутри make-request (тут не показано) при невозможности скачать картинку. Далее, даунлоадер предоставляет стратегии исправления ошибок (пропуск треда, пропуск файла, повтор попытки). handle-conditions выбирает нужную стратегию в зависимости от ошибки (выбрать один из рестартов или вывалиться в интерактивный отладчик), а также печатает какую-либо осмысленную инфу об ошибке. Наконец, в download-images мы связываем обработчик ошибок handle-conditions с функцией скачивания.<br><br>Если заменять condition на простое значение (NULL), теряется весь смысл какого-то особого мехазизма обработки ошибок. Получается что-то в роде C с кодами ошибок</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222594</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222594</guid>
<pubDate>Mon, 19 Mar 2018 04:54:19 +0300</pubDate>
<description><![CDATA[<p>handler-bind, restart-case все дела</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222588</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222588</guid>
<pubDate>Sat, 17 Mar 2018 15:29:26 +0300</pubDate>
<description><![CDATA[<p>Как минимум семь строчек кода в твоем примере лишние, если бы ты понимал зачем нужны исключения))) Лано, бывает))</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222587</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222587</guid>
<pubDate>Sat, 17 Mar 2018 11:35:59 +0300</pubDate>
<description><![CDATA[<p><i>> А в настоящем времени на чем оно валится и ты ожидаешь по сотне репортов в день? </i><br><br /><br><br>Обычно я что-то не проверил на нуль или возбудился фирменный Exception из библиотечных классов. Еще бывает попытка изменить состояние в компонетах GUI из параллельных потоков.</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222586</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222586</guid>
<pubDate>Sat, 17 Mar 2018 11:32:02 +0300</pubDate>
<description><![CDATA[<p>&gt; А как разгребать сотни отчетов об ошибках?
<br>
<br>
grep'ом. Да и в джаво обычно получается достаточно наглядный трейс чтобы сразу понять что там пошло поперёк борозды.</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222585</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222585</guid>
<pubDate>Sat, 17 Mar 2018 11:26:43 +0300</pubDate>
<description><![CDATA[<p>&gt; А если заменить catch (Exception e) на catch (Throwable t) 
<br><br>
Кстати, интересно. Я раньше как-то не обращал внимания на этот нюанс.
<br><br>
&gt; отлавливаться будут еще и такие вещи, как истощение свободного места в куче
<br><br>
А в настоящем времени на чем оно валится и ты ожидаешь по сотне репортов в день?
</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222584</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222584</guid>
<pubDate>Sat, 17 Mar 2018 11:23:03 +0300</pubDate>
<description><![CDATA[<p><i>> И смотри что, на 13 студенте у тебя случилось что-то плохое и ты вернул NULL. Дальше уже продолжать нет смысла, гарантировано Васей ты уже не пересчитаешь. Что ты будешь делать в своем случае? Как минимум будешь проверять всех на != NULL, потом что список у тебя без NULL. Верно?</i><br> <br /><br><br>Нет не верно<br><br><fieldset><legend>java</legend><div class="highlight java"><br />
<span class="kw1">static</span> <span class="kw1">public</span> ArrayList<span class="sy0">&lt;</span>ObjectWithName<span class="sy0">&gt;</span> getVasyas<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; ArrayList<span class="sy0">&lt;</span>ObjectWithName<span class="sy0">&gt;</span> students <span class="sy0">=</span> getStudents<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>students <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;[ERROR] Не удалось получить список студентов&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span> <span class="co1">//ERROR_EXIT</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; ArrayList<span class="sy0">&lt;</span>ObjectWithName<span class="sy0">&gt;</span> result <span class="sy0">=</span> <span class="kw1">new</span> ArrayList<span class="sy0">&lt;&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>ObjectWithName student <span class="sy0">:</span> students<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> name <span class="sy0">=</span> student.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>name <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;[ERROR] Не удалось получить имя студента&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span> <span class="co1">//ERROR_EXIT</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>name.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;Vasia&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.<span class="me1">add</span><span class="br0">&#40;</span>student<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> result<span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div></fieldset><br><br>И не надо мне проверять весь список по завершению его заполнения. То есть чуть что, я возвращаю null из любого места в методе, если в этом месте можно возбудить exception.</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222583</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222583</guid>
<pubDate>Sat, 17 Mar 2018 11:17:28 +0300</pubDate>
<description><![CDATA[<p>&gt; Поясните для Си-нациста, что отлавливает данная конструкция, если проверка на не-NULL и пустую строку происходит явно?
<br><br>
Видимо метод generateNewName() валится при недостатке вычислительных ресурсов для генерации имени :)</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222582</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222582</guid>
<pubDate>Sat, 17 Mar 2018 11:10:43 +0300</pubDate>
<description><![CDATA[<p><i>> Поясните для Си-нациста, что отлавливает данная конструкция, если проверка на не-NULL и пустую строку происходит явно?</i><br> <br /><br><br>Блок отлавливает любой выброс Exception методом generateNewName() или любым методом, который вызывается внутри метода generateNewName(). А если заменить <fieldset><legend>java</legend><div class="highlight java"><br />
<span class="kw1">try</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//...</span><br />
<span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//...</span><br />
<span class="br0">&#125;</span> <br />
&nbsp;</div></fieldset><br><br>на <br><br><fieldset><legend>java</legend><div class="highlight java"><br />
<span class="kw1">try</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//...</span><br />
<span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Athrowable+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Throwable</span></a> t<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//...</span><br />
<span class="br0">&#125;</span> <br />
&nbsp;</div></fieldset><br><br>то отлавливаться будут еще и такие вещи, как истощение свободного места в куче, с чем я столкнулся впервые в прошлую пятницу вечером и сейчас читаю статьи, почему в java сборщик мусора не всегда вычищает объекты, которые мне больше не нужны. Блин, накосячил я... Но у нас все думают, что сборщик мусора умен и всё чистит, а профилировщиками никто не пользуется и дампы никогда не делает.</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222581</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222581</guid>
<pubDate>Sat, 17 Mar 2018 11:07:48 +0300</pubDate>
<description><![CDATA[<p>Пиздец Амур, ты же вроде как тут нам показывал системные подходы в проживании своей жизни))) И поэтому я собственно удивлен, что ты так и не прочитал, что же такое исключения и для чего они нужны)))<br><br>Попробую объяснить кратенько. Функция возвращающая имя, не должна возвращать NULL, если ты используешь исключения. Представь себе, у тебя сложное действие из нескольких сложенных шагов (вызовов функций). Например посчитать сколько в группе Васей. То есть &quot;Счет Васей&quot; &lt;&lt; &quot;Получение списка имен&quot; &lt;&lt; &quot;Получение конкретного имени&quot;. И смотри что, на 13 студенте у тебя случилось что-то плохое и ты вернул NULL. Дальше уже продолжать нет смысла, гарантировано Васей ты уже не пересчитаешь. Что ты будешь делать в своем случае? Как минимум будешь проверять всех на != NULL, потом что список у тебя без NULL. Верно? А представь у тебя более глубокая вложенность кода и &quot;список Вась&quot; это лишь малая часть, но без валидного этого списка, все действия надо отменить. Ты утрахаешься все эти проверки делать.<br><br>Но если ты не ловишь исключение до места воззврата результата. В данном примере до места возврата количества Вась, серьезно упростишь весть код. Догоняеешь?))<br><br>Именно для таких случаем, умные дядки, не помню в каком языке впервые, но запелили эти самые - исключения.<br><br></p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222580</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222580</guid>
<pubDate>Sat, 17 Mar 2018 08:01:15 +0300</pubDate>
<description><![CDATA[<p>Поясните для Си-нациста, что отлавливает данная конструкция, если проверка на не-NULL и пустую строку происходит явно?<br><br><i>> try {...} catch</i><br><br><br><i>> я сделал специальное диалоговое окно, которое выскакивает при исключениях</i><br> Такой подход был в 90-х. Выскакивающие посреди работы надоедливые окна никто не читает.</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222579</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222579</guid>
<pubDate>Sat, 17 Mar 2018 06:35:51 +0300</pubDate>
<description><![CDATA[<p><i>>сделал специальное диалоговое окно</i><br> Я, как пользователь  джава приложений, всегда с трудом находил что то полезное в месиве портянкок  которые они  выдают.<br><br> Но в целом да, явное  лучше  неявного.<br><br><br><br>p.s. А как разгребать  сотни отчетов об ошибках?</p>]]></description>
</item>
<item>
<title>Re:Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222578</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222578</guid>
<pubDate>Sat, 17 Mar 2018 00:45:05 +0300</pubDate>
<description><![CDATA[<p>Всё, что отправляется в консоль, сохраняется в логах. Логи тоже копируются в отчет</p>]]></description>
</item>
<item>
<title>Exception</title>
<link>https://rulinux.net/message.php?newsid=43127&amp;page=1#222577</link>
<guid>https://rulinux.net/message.php?newsid=43127&amp;page=1#222577</guid>
<pubDate>Sat, 17 Mar 2018 00:34:05 +0300</pubDate>
<description><![CDATA[<p>Как вы обрабатываете исключения?<br><br>Я не люблю передавать исключения дальше по вызову. Сначала я делал так (для примера): <fieldset><legend>java</legend><div class="highlight java"><br />
<span class="co3">/**<br />
&nbsp;* Возвращает имя объекта. <br />
&nbsp;* В случае ошибки возвращает null.<br />
&nbsp;*/</span><br />
<span class="kw1">public</span> <span class="kw1">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getName<span class="br0">&#40;</span>ObjectWithName arg<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>arg.<span class="me1">name</span> <span class="sy0">!=</span> <span class="kw2">null</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span>arg.<span class="me1">name</span>.<span class="me1">isEmpty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> arg.<span class="me1">name</span><span class="sy0">;</span> <span class="co1">//OK_EXIT</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> generateNewName<span class="br0">&#40;</span>arg<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// OK_EXIT</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;[ERROR] Не удалось получить имя&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span> <span class="co1">//ERROR_EXIT</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div></fieldset><br><br>А метод, который вызывает этот метод, проверяет результат на null и сам думает, что делать. Первое время меня это устраивало, так как на моем компьютере у меня исключений никогда не было или они были некритичными для меня.<br><br>Однако у пользователей исключения случаются часто и они критичные. Так как я фронт-энд разработчик, то я сделал специальное диалоговое окно, которое выскакивает при исключениях. Содержит извинения и адрес на локальном диске, где собран подробный отчет об ошибке. В отчет входит:<br><br><ul> <li>&nbsp; Тематическое пояснение к исключению <li>&nbsp; Распечатка стека вызовов <li>&nbsp; Скриншот всего основного монитора на момент исключения <li>&nbsp; Фрагмент декомпилированного кода, в котором возникло исключение (класс задается явно, так как может интересовать не фронтовой относительно исключения класс, а второй или третий эшелон). Фрагмент включает плюс-минус 30 строчек вокруг строки с ошибкой, с указанием номеров строк и меткой у строки с ошибкой. <li>&nbsp; Список полей и их значений у некоторых объектов</ul><br><br>Сейчас я думаю добавить в диалог галочку, чтобы в отчет добавлялся снимок кучи. Также думаю копировать все отчеты на шару. Ожидаю в день по 100 отчетов.<br><br><fieldset><legend>java</legend><div class="highlight java"><br />
<span class="co3">/**<br />
&nbsp;* Возвращает имя объекта. <br />
&nbsp;* В случае ошибки создает отчет.<br />
&nbsp;*/</span><br />
<span class="kw1">public</span> <span class="kw1">static</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a> getName<span class="br0">&#40;</span>ObjectWithName arg<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">try</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>arg.<span class="me1">name</span> <span class="sy0">!=</span> <span class="kw2">null</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span>arg.<span class="me1">name</span>.<span class="me1">isEmpty</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> arg.<span class="me1">name</span><span class="sy0">;</span> <span class="co1">//OK_EXIT</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> generateNewName<span class="br0">&#40;</span>arg<span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// OK_EXIT</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Errors.<span class="me1">DisplayReport</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;Исключение при получении имени для ObjectWithName&quot;</span>, <span class="co1">// тематический комментарий</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e, <span class="co1">// Откуда извлечь стек вызовов</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectWithName.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="co1">// фрагмент кода какого класса показать</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arg &nbsp;<span class="co1">// объект для анализа значений полей</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> RunTimeException<span class="br0">&#40;</span><span class="st0">&quot;Так жить больше нельзя&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
&nbsp;</div></fieldset></p>]]></description>
</item>
</channel>
</rss>