CakePHP - Manual/CommonTasks/ErrorHandling /wiki/Manual/CommonTasks/ErrorHandling History/revisions of CakePHP/Manual/CommonTasks/ErrorHandling en-us 2009-03-25 15:56:19 /wiki/Manual/CommonTasks/ErrorHandling/show?time=2009-03-25+15%3A56%3A19 <div class="pageBefore"><img src="/wiki_/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" /></div><div class="page"> <b>Сравнение версий <a name=".manual.commontasks.errorhandling" href="/wiki/Manual/CommonTasks/ErrorHandling" class="">/Manual&nbsp;/&nbsp;Common&nbsp;Tasks&nbsp;/&nbsp;Error&nbsp;Handling</a> за <a href="/wiki/Manual/CommonTasks/ErrorHandling?time=2009-03-25+15%3A56%3A19">2009-03-25 15:56:19</a> и <a href="/wiki/Manual/CommonTasks/ErrorHandling">2009-04-14 17:17:38</a></b><br /> <br /> <b>Добавлено:</b><br /> <div class="additions"><br /> В&nbsp;случае неразрешимой ошибки в&nbsp;вашем приложении, обычно приложение прекращает обработку данных и&nbsp;выводит для&nbsp;пользователя страницу с&nbsp;ошибкой. Для&nbsp;того, чтобы не&nbsp;писать обработку ошибок для&nbsp;каждого контроллера и&nbsp;компонента, вы&nbsp;можете использовать предлагаемый метод:<br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?&nbsp;$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">cakeError</span><span style="color: #007700">(&lt;</span><span style="color: #0000BB">string&nbsp;errorType</span><span style="color: #007700">&gt;,&nbsp;[array&nbsp;</span><span style="color: #0000BB">parameters</span><span style="color: #007700">]);&nbsp;</span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> <br /> Вызов этого метода отобразит пользователю страницу с&nbsp;ошибкой и&nbsp;и прекратит дальнейшую обработку данных в&nbsp;вашем приложении.<br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> parameters&nbsp;должен&nbsp;быть&nbsp;массивом&nbsp;строк.&nbsp;Если&nbsp;массив&nbsp;содержит&nbsp;объекты&nbsp;<br />(включая&nbsp;Exception&nbsp;объекты),&nbsp;то&nbsp;они&nbsp;будут&nbsp;приведены&nbsp;в&nbsp;строки.</span> </code></div><!--/notypo--><br /> <br /> В&nbsp;<!--notypo-->CakePHP<!--/notypo--> определены множество типов ошибок, но&nbsp;во время написания, большинство типов ошибок действительно полезны только для&nbsp;фреймворка. Наиболее полезная для&nbsp;разработчика приложений &ndash; это&nbsp;старая добрая 404 ошибка. Она&nbsp;может быть вызвана без&nbsp;параметров следующим образом:<br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?&nbsp;$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">cakeError</span><span style="color: #007700">(</span><span style="color: #DD0000">'error404'</span><span style="color: #007700">);&nbsp;</span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> <br /> Или, другой вариант, вы&nbsp;можете вызвать страницу для&nbsp;отчета об&nbsp;ошибке, передав параметр url:<br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?&nbsp;$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">cakeError</span><span style="color: #007700">(</span><span style="color: #DD0000">'error404'</span><span style="color: #007700">,&nbsp;array(</span><span style="color: #DD0000">'url'&nbsp;</span><span style="color: #007700">=&gt;&nbsp;</span><span style="color: #DD0000">'some/other.url'</span><span style="color: #007700">));&nbsp;</span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> <br /> Это&nbsp;все становится более полезным, если расширить обработку ошибок для&nbsp;использования ваших собственных типов ошибок. Обработчики ошибок приложения больше всего похожи на&nbsp;действия контроллера; Вы&nbsp;типично будете передавать с&nbsp;помощью set() любой параметр, чтобы он&nbsp;был доступен в&nbsp;отображении и&nbsp;затем рендерить файл отображения и&nbsp;вашего каталога app/views/errors.<br /> <br /> Создадим файл app/app_error.php со&nbsp;следующим определением.<br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">AppError&nbsp;</span><span style="color: #007700">extends&nbsp;</span><span style="color: #0000BB">ErrorHandler&nbsp;</span><span style="color: #007700">{<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> <br /> Обработчики для&nbsp;новых типов ошибок будут реализовываться путем добавления методов в&nbsp;этот класс. Просто создайте новый метод с&nbsp;именем, которое вы&nbsp;хотите использовать в&nbsp;качестве типа ошибки.<br /> <br /> Предположим у&nbsp;нас есть приложение, которое записывает файлы на&nbsp;диск и&nbsp;это приложение должно выводить пользователям отчет об&nbsp;ошибках записи. Мы&nbsp;не хотим добавлять код&nbsp;для всего этого в&nbsp;различные части нашего приложения, таким образом &ndash; это&nbsp;отличная причина для&nbsp;использования нового типа ошибки.<br /> <br /> Добавьте новый метод в&nbsp;ваш класс <!--notypo-->AppError<!--/notypo-->. Мы&nbsp;будем принимать один параметр file &ndash; путь к&nbsp;файлу, который не&nbsp;удалось записать. <br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?<br /></span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">cannotWriteFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$params</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">controller</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">set</span><span style="color: #007700">(</span><span style="color: #DD0000">'file'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$params</span><span style="color: #007700">[</span><span style="color: #DD0000">'file'</span><span style="color: #007700">]);<br />&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">_outputMessage</span><span style="color: #007700">(</span><span style="color: #DD0000">'cannot_write_file'</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> <br /> Создайте отображение в&nbsp;app/views/errors/cannot_write_file.ctp<br /> <br /> <!--notypo--><div class="code"><pre></pre></div><!--/notypo--><br /> <br /> и&nbsp;добавьте ошибку в&nbsp;ваш контроллер/компонент<br /> <br /> <!--notypo--><div class="code"><code><span style="color: #000000"> <span style="color: #0000BB">&lt;?<br />&nbsp;&nbsp;&nbsp;$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">cakeError</span><span style="color: #007700">(</span><span style="color: #DD0000">'cannotWriteFile'</span><span style="color: #007700">,&nbsp;array(</span><span style="color: #DD0000">'file'</span><span style="color: #007700">=&gt;</span><span style="color: #DD0000">'somefilename'</span><span style="color: #007700">));&nbsp;<br /></span><span style="color: #0000BB">?&gt;</span> </span> </code></div><!--/notypo--><br /> <br /> По&nbsp;умолчанию $this-&gt;<!--notypo-->__outputMessage(&lt;view-filename&gt;)<!--/notypo--> просто отобразит отображение views/errors/&lt;view-filename&gt;.ctp. Если вы&nbsp;желаете изменить это&nbsp;поведение, то&nbsp;вы можете переопределить <!--notypo-->__outputMessage($template)<!--/notypo--> в&nbsp;вашем классе <!--notypo-->AppError<!--/notypo-->.<br /> <br /> <span class="missingpage">&lt;&lt; Чистка данных</span><a href="/wiki/DataSanitization/edit?add=1" title="Создать эту страницу">?</a> | <span class="missingpage">Отладка &gt;&gt;</span><a href="/wiki/Debugging/edit?add=1" title="Создать эту страницу">?</a><br /></div></div>