<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F</id>
		<title>Исключения - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/index.php?action=history&amp;feed=atom&amp;title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;action=history"/>
		<updated>2026-05-14T07:50:25Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=1454&amp;oldid=prev</id>
		<title>KorovinAA: /* Гарантии, которые может предоставлять код по отношению к исключениям */</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=1454&amp;oldid=prev"/>
				<updated>2012-06-11T06:53:02Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Гарантии, которые может предоставлять код по отношению к исключениям&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='ru'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:53, 11 июня 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l174&quot; &gt;Строка 174:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 174:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		catch(...)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		catch(...)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		{&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		{&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			delete data_;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			delete &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[] &lt;/ins&gt;data_;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			data_ = old_data;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			data_ = old_data;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			size_ = old_size;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			size_ = old_size;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>KorovinAA</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=350&amp;oldid=prev</id>
		<title>Alexey.Gurevich: /* Исключения */</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=350&amp;oldid=prev"/>
				<updated>2011-06-01T07:51:57Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Исключения&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='ru'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:51, 1 июня 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l83&quot; &gt;Строка 83:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 83:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Это избавит нас от необходимости проверять еще какую-то информацию, неявно передаваемую в кидаемом экземпляре примитивного типа.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Это избавит нас от необходимости проверять еще какую-то информацию, неявно передаваемую в кидаемом экземпляре примитивного типа.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Для удобства в стандартной библиотеки &amp;lt;code&amp;gt;stl&amp;lt;/code&amp;gt; уже есть класс исключений &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt;, объявленный в файле &amp;lt;code&amp;gt;&amp;lt;exception&amp;gt;&amp;lt;/code&amp;gt;. Для поддержания единообразности кода на C++, следует наследовать свои классы исключений от него. Также у &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt; есть виртуальный метод &amp;lt;code&amp;gt;what()&amp;lt;/code&amp;gt;, который удобно использовать для возвращения информации об исключении&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Для удобства в стандартной библиотеки &amp;lt;code&amp;gt;stl&amp;lt;/code&amp;gt; уже есть класс исключений &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt;, объявленный в файле &amp;lt;code&amp;gt;&amp;lt;exception&amp;gt;&amp;lt;/code&amp;gt;. Для поддержания единообразности кода на C++, следует наследовать свои классы исключений от него. Также у &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt; есть виртуальный метод &amp;lt;code&amp;gt;what()&amp;lt;/code&amp;gt;, который удобно использовать для возвращения информации об исключении&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;в удобном для прочитывания человеком формате. Также стандартная библиотека &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;поределяет накоторые &lt;/del&gt;другие классы, например &amp;lt;code&amp;gt;std::logic_error, std::runtime_error, std::bad_alloc&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;в удобном для прочитывания человеком формате. Также стандартная библиотека &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;определяет некоторые &lt;/ins&gt;другие классы, например &amp;lt;code&amp;gt;std::logic_error, std::runtime_error, std::bad_alloc&amp;lt;/code&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Нужно помнить, что при выборе блока &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt;, который соответствует кинутому исключению, приведение типов не происходит. Одновременно может быть активно только одно исключение, поэтому если во время всплытия исключения по стеку&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Нужно помнить, что при выборе блока &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt;, который соответствует кинутому исключению, приведение типов не происходит. Одновременно может быть активно только одно исключение, поэтому если во время всплытия исключения по стеку&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Alexey.Gurevich</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=239&amp;oldid=prev</id>
		<title>Eabatalov89: /* Assert */</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=239&amp;oldid=prev"/>
				<updated>2011-05-18T23:43:17Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Assert&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='ru'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 23:43, 18 мая 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l32&quot; &gt;Строка 32:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 32:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Строка с комментарием к assert'у &amp;quot;working with ...&amp;quot; - это ненулевой char const *, потому он всегда True и не влияет на &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;рещультат &lt;/del&gt;логического И.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Строка с комментарием к assert'у &amp;quot;working with ...&amp;quot; - это ненулевой char const *, потому он всегда True и не влияет на &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;результат &lt;/ins&gt;логического И.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Исключения ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Исключения ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=238&amp;oldid=prev</id>
		<title>Eabatalov89: Новая страница: «== Обработка ошибок == В программах всегда возникают ошибки. Их надо уметь обрабатывать, ина…»</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=%D0%98%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=238&amp;oldid=prev"/>
				<updated>2011-05-18T23:40:28Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «== Обработка ошибок == В программах всегда возникают ошибки. Их надо уметь обрабатывать, ина…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Обработка ошибок ==&lt;br /&gt;
В программах всегда возникают ошибки. Их надо уметь обрабатывать, иначе часто мы будем беспокоить пользователя по пустяку. Рассмотрим основные способы обработки ошибок.&lt;br /&gt;
&lt;br /&gt;
== Обработка кода возврата ==&lt;br /&gt;
Из каждой функции возвращаем код, в котором содержится дополнительная информация о результате работы функции. &lt;br /&gt;
Программист функции задает семантику этого кода. Одним из его значений должен быть &amp;quot;успех&amp;quot;. Результат функции возвращается через параметр, передаваемый по ссылке. &lt;br /&gt;
Такой подход увеличивает колличество кода. Нужно проверять код возврата. В зависимости от проекта, этот код может понадобиться проверять каждый раз после вызова функции.&lt;br /&gt;
Также пользователь функции должен знать семантику кода возврата. Для кода возврата можно не создавать отдельную переменную в сигнатуре функции.&lt;br /&gt;
Можно возвращать значение, которое не входит в множество допустимых значений. Например, результат функции всегда положительный, но мы возвратим отрицательное число, если что-то пошло не так.&lt;br /&gt;
Тогда вызов будет короче, но мы совместим ответственности - результат будет отвечает и за ошибки. Если множество значений функции в перспективе может расшириться, то этот способ не подходит.&lt;br /&gt;
&lt;br /&gt;
== Глобальная переменная errno ==&lt;br /&gt;
Все функции в случае возникновения ошибки записывают ее код в глобальную переменную errno. Проверять errno может понадобиться после каждого вызова.&lt;br /&gt;
При таком подходе мы можем строить выражения из вызовов функций. Использование глобальной переменной требует синхронизации в многопоточных приложениях.&lt;br /&gt;
&lt;br /&gt;
== SEH, Signals ==&lt;br /&gt;
Платформенно зависимые исключения и сигналы от ОС. Например деление на 0, извлечение квадратного корня из отрицательного числа, разъименование нулевого указателя, порча стека и т.п.&lt;br /&gt;
Обычно говорят о том, что дальнейшее выполнение программы не имеет смысла, потому часто явно не обрабатываются в программах. 24/7/365 сервисы обычно требуют обработки таких исключений.&lt;br /&gt;
Это отдельная большая тема.&lt;br /&gt;
&lt;br /&gt;
== Assert ==&lt;br /&gt;
Это утверждения, логические условия, истинность которых проверяется либо во время выполнения, либо во время компиляции (static assert). &lt;br /&gt;
Если статическое утверждение во время компиляции ложно, то возникает ошибка компиляции. Если во время вполнения утверждение ложно, то&lt;br /&gt;
в стандартный поток ошибок выводится текст этого утверждения и программа завершается. &lt;br /&gt;
Assert'ы отключаются, если при компиляции определен символ NDEBUG.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;cassert&amp;gt;&lt;br /&gt;
assert(1 + 1 == 2 &amp;amp;&amp;amp; &amp;quot;working with field which charcteristic &amp;gt; 2&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Строка с комментарием к assert'у &amp;quot;working with ...&amp;quot; - это ненулевой char const *, потому он всегда True и не влияет на рещультат логического И.&lt;br /&gt;
&lt;br /&gt;
== Исключения ==&lt;br /&gt;
Исключение - событие, возникающее во время выполнения программы. Обычно обозначает что-то негативное. Существуют различные точки зрения на то, когда нужно использовать исключения.&lt;br /&gt;
Некоторые используют их, когда произошло малейшее нарушение работы программы (например ошибка конвертации строки в число), а другие только в случае если дальнейшее выполнение программы не имеет смысла.&lt;br /&gt;
&lt;br /&gt;
Работа с исключениями состоит из следующих этапов:&lt;br /&gt;
* Выполнено условие, при котором стоит сообщить внешнему коду о произошедшей ошибке.&lt;br /&gt;
* Бросается исключение.&lt;br /&gt;
* Исключение всплывает по стеку вызовов программы до первой точки, в которой это исключение может быть обработано.&lt;br /&gt;
* В обработчике исключения можно выполнить все действия для восстановления программы и продолжить ее выполнение или если это не возможно в данном месте кода, бросить новое исключение дальше по стеку. &lt;br /&gt;
* Если исключение не было обработано и всплыло выше функции main, то вызывается обработчик unexpected, который по умолчанию завершает выполнение программы.&lt;br /&gt;
&lt;br /&gt;
Некоторые моменты: &lt;br /&gt;
* Если исключение поймано (обработано), то вызовутся деструкторы всех объектов, которые лежали на стеке от места бросания до места обработки.&lt;br /&gt;
* Если мы выделим память в куче, а затем кинем исключение, то выделенная память не будет освобождена (деструктор указателя ничего не делает).&lt;br /&gt;
* Реальный механизм работы исключений и его накладные расходы зависит от разрядности процессора и ОС.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим базовый синтаксис работы с исключениям ив C++:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
	try&lt;br /&gt;
	{&lt;br /&gt;
		if (a == 0)&lt;br /&gt;
			throw 0;&lt;br /&gt;
		int res = 10/a;&lt;br /&gt;
	}&lt;br /&gt;
	catch(int ex)&lt;br /&gt;
	{&lt;br /&gt;
		if (ex == 0)&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;division by zero&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
	}&lt;br /&gt;
	catch(float ex)&lt;br /&gt;
	{&lt;br /&gt;
		if (ex &amp;gt;= 0)&lt;br /&gt;
			std::cerr &amp;lt;&amp;lt; &amp;quot;float&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;try {}&amp;lt;/code&amp;gt; показывает границы блока кода, в котором мы хотим ловить исключения. Исключения будут ловиться не только в самом блоке, &lt;br /&gt;
но и ниже по стеку вызовов - во всех функциях, вызванных из блока &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;catch(...){}&amp;lt;/code&amp;gt; определяет код-обработчик исключения, который выполняется в случае если оно было кинуто в &amp;lt;code&amp;gt;try&amp;lt;/code&amp;gt;. Аргумент &amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt; означает что будут ловиться все исключения.&lt;br /&gt;
Если мы хотим перехватить исключение какого-то конкретного типа, то в аргументе &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; объявляют переменную этого типа. Для классов и структур используется константная ссылка.&lt;br /&gt;
* Оператор &amp;lt;code&amp;gt;throw&amp;lt;/code&amp;gt; принимает экземпляр типа, который мы хотим кинуть.&lt;br /&gt;
&lt;br /&gt;
Давайте поймем почему код, который бросает примитивные типы плох?&lt;br /&gt;
В обработчике &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt; нам приходится проверять какое целое значение было кинуто, чтобы понять что с ним делать.&lt;br /&gt;
Мы можем определить отдельный класс для каждого исключения и бросать уже объекты этих классов. &lt;br /&gt;
Это избавит нас от необходимости проверять еще какую-то информацию, неявно передаваемую в кидаемом экземпляре примитивного типа.&lt;br /&gt;
Для удобства в стандартной библиотеки &amp;lt;code&amp;gt;stl&amp;lt;/code&amp;gt; уже есть класс исключений &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt;, объявленный в файле &amp;lt;code&amp;gt;&amp;lt;exception&amp;gt;&amp;lt;/code&amp;gt;. Для поддержания единообразности кода на C++, следует наследовать свои классы исключений от него. Также у &amp;lt;code&amp;gt;std::exception&amp;lt;/code&amp;gt; есть виртуальный метод &amp;lt;code&amp;gt;what()&amp;lt;/code&amp;gt;, который удобно использовать для возвращения информации об исключении&lt;br /&gt;
в удобном для прочитывания человеком формате. Также стандартная библиотека поределяет накоторые другие классы, например &amp;lt;code&amp;gt;std::logic_error, std::runtime_error, std::bad_alloc&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Нужно помнить, что при выборе блока &amp;lt;code&amp;gt;catch&amp;lt;/code&amp;gt;, который соответствует кинутому исключению, приведение типов не происходит. Одновременно может быть активно только одно исключение, поэтому если во время всплытия исключения по стеку&lt;br /&gt;
до того как исключение найдет свой обработчик, кинется еще одно исключение, программа полностью закончит свое выполнение. Теперь давайте вспомним какой код выподняется &lt;br /&gt;
во время всплытия исключения - происходят вызовы всех деструкторов. Если хотябы один деструктор кинет исключение, то программа полностью завершится. Поэтому деструкторы не должны кидать исключений. &lt;br /&gt;
Теперь представим себе что будет, если кинуть исключение в конструкторе - до завершения конструктора объект не считается созданным, потому в случае падения исключения в конструкторе, деструктор создаваемого объекта &lt;br /&gt;
не будет вызван. То есть если мы уже выделили какой-то ресурс в конструкторе, а потом в нем возникло исключение, то ресурс не будут освобожден.&lt;br /&gt;
Поэтому надо писать конструкторы так, чтобы при возникновении в нем исключения, можно было освободить занятые ресурсы и сообщить об исключении дальше.&lt;br /&gt;
Напомним также, что при нормальной работе программы оператор &amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt; не кидает исключений, а оператор &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt; может.&lt;br /&gt;
Напишем класс, который освободит выделенную память если произошло исключение в конструкторе. &lt;br /&gt;
Здесь же используется специальный синтаксис для перехвата исключений в списке инициализации.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct A&lt;br /&gt;
{&lt;br /&gt;
	int* p1;&lt;br /&gt;
	int* p2;&lt;br /&gt;
&lt;br /&gt;
	A(size_t p1_sz, size_t p2_sz) &lt;br /&gt;
		try&lt;br /&gt;
		:	p1(new int[p1_sz])&lt;br /&gt;
		,	p2(0)&lt;br /&gt;
	{&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			p2 = new int[p2_sz];&lt;br /&gt;
		}&lt;br /&gt;
		catch(...)&lt;br /&gt;
		{&lt;br /&gt;
			delete[] p1; //only p1 allocated&lt;br /&gt;
			throw;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	catch(...)&lt;br /&gt;
	{&lt;br /&gt;
		//no memory allocated&lt;br /&gt;
		throw;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	~A()&lt;br /&gt;
	{&lt;br /&gt;
		delete[] p1;&lt;br /&gt;
		delete[] p2;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Упражнение:&lt;br /&gt;
Опеределить сколько исключений может быть брошено в следующем участке кода, если a и b - экземпляры произвольных типов данных.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
	if (a + b == c + d)&lt;br /&gt;
	{&lt;br /&gt;
		return a * b;&lt;br /&gt;
	}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подсказка: учтите что вызываются операторы приведения типов, +, *, ==.&lt;br /&gt;
&lt;br /&gt;
== Гарантии, которые может предоставлять код по отношению к исключениям ==&lt;br /&gt;
Далее будет удобно оперировать понятием объекта, но все сказанное также относится и к обычным функциям.&lt;br /&gt;
Код, который мы пишем и используем, при возникновении внутри себя исключений может вести себя по разному. Это поведение и определяют уровни гарантий исключений.&lt;br /&gt;
Они специфицируют каким будет поведение кода и каково будет состояние объекта по отношению к внешнему миру, после возникновения в нем исключения. Рассмотрим их.&lt;br /&gt;
&lt;br /&gt;
* Гарантия отсутствия исключений. Такая гарантия специфицирует, что либо ошибок нет, либо все ошибки обрабатываются и объект выполняет все требуемые функции.&lt;br /&gt;
* Строгая гарантия исключений (транзакционность). Объект после обработки ошибки возвращается в состояние перед вызовом метода, в котором она возникла. Если мы выполняем ввод\вывод, то гарантировать строгую гарантию невозможно без очень сложных мероприятий.&lt;br /&gt;
* Базовая гарантия. После обработки исключения оказываемся в любом другом согласованном состоянии.&lt;br /&gt;
&lt;br /&gt;
Напишем неполный класс массива, который реализует строгую гарантию исключений при копировании через конструктор.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
template&amp;lt;typename T&amp;gt;&lt;br /&gt;
struct Array&lt;br /&gt;
{&lt;br /&gt;
	Array(size_t size)&lt;br /&gt;
		:	size_(size)&lt;br /&gt;
		,	data_(new T[size])&lt;br /&gt;
	{}&lt;br /&gt;
&lt;br /&gt;
	Array(Array const &amp;amp; src)&lt;br /&gt;
	{&lt;br /&gt;
		T* old_data = data_;&lt;br /&gt;
		size_t old_size = size_;&lt;br /&gt;
		try&lt;br /&gt;
		{&lt;br /&gt;
			data_ = new T[src.size_];&lt;br /&gt;
			size_ = src.size_;&lt;br /&gt;
			for(size_t i = 0; i &amp;lt; size_; ++i)&lt;br /&gt;
				data_[i] = src.data_[i];&lt;br /&gt;
		}&lt;br /&gt;
		catch(...)&lt;br /&gt;
		{&lt;br /&gt;
			delete data_;&lt;br /&gt;
			data_ = old_data;&lt;br /&gt;
			size_ = old_size;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	T* data_;&lt;br /&gt;
	size_t size_;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Eabatalov89</name></author>	</entry>

	</feed>