File: Exception-and-Error-Handling-in-Oct_002dFiles.html

package info (click to toggle)
octave 3.8.2-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 84,396 kB
  • ctags: 45,547
  • sloc: cpp: 293,356; ansic: 42,041; fortran: 23,669; sh: 13,629; objc: 7,890; yacc: 7,093; lex: 3,442; java: 2,125; makefile: 1,589; perl: 1,009; awk: 974; xml: 34
file content (168 lines) | stat: -rw-r--r-- 7,735 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Octave: Exception and Error Handling in Oct-Files</title>

<meta name="description" content="GNU Octave: Exception and Error Handling in Oct-Files">
<meta name="keywords" content="GNU Octave: Exception and Error Handling in Oct-Files">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Oct_002dFiles.html#Oct_002dFiles" rel="up" title="Oct-Files">
<link href="Documentation-and-Test-of-Oct_002dFiles.html#Documentation-and-Test-of-Oct_002dFiles" rel="next" title="Documentation and Test of Oct-Files">
<link href="Input-Parameter-Checking-in-Oct_002dFiles.html#Input-Parameter-Checking-in-Oct_002dFiles" rel="prev" title="Input Parameter Checking in Oct-Files">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>


</head>

<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Exception-and-Error-Handling-in-Oct_002dFiles"></a>
<div class="header">
<p>
Next: <a href="Documentation-and-Test-of-Oct_002dFiles.html#Documentation-and-Test-of-Oct_002dFiles" accesskey="n" rel="next">Documentation and Test of Oct-Files</a>, Previous: <a href="Input-Parameter-Checking-in-Oct_002dFiles.html#Input-Parameter-Checking-in-Oct_002dFiles" accesskey="p" rel="prev">Input Parameter Checking in Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Exception-and-Error-Handling-in-Oct_002dFiles-1"></a>
<h4 class="subsection">A.1.12 Exception and Error Handling in Oct-Files</h4>

<p>Another important feature of Octave is its ability to react to the user
typing <tt class="key">Control-C</tt> even during calculations.  This ability is based on the
C++ exception handler, where memory allocated by the C++ new/delete
methods are automatically released when the exception is treated.  When
writing an oct-file, to allow Octave to treat the user typing <tt class="key">Control-C</tt>,
the <code><span class="nolinebreak">OCTAVE_QUIT</span></code><!-- /@w --> macro is supplied.  For example:
</p>
<div class="example">
<pre class="example">for (octave_idx_type i = 0; i &lt; a.nelem (); i++)
  {
    OCTAVE_QUIT;
    b.elem (i) = 2. * a.elem (i);
  }
</pre></div>

<p>The presence of the <code><span class="nolinebreak">OCTAVE_QUIT</span></code><!-- /@w --> macro in the inner loop allows
Octave to treat the user request with the <tt class="key">Control-C</tt>.  Without this macro,
the user must either wait for the function to return before the interrupt is
processed, or press <tt class="key">Control-C</tt> three times to force Octave to exit.
</p>
<p>The <code><span class="nolinebreak">OCTAVE_QUIT</span></code><!-- /@w --> macro does impose a very small speed penalty, and so
for loops that are known to be small it might not make sense to include
<code><span class="nolinebreak">OCTAVE_QUIT</span></code><!-- /@w -->.
</p>
<p>When creating an oct-file that uses an external libraries, the function
might spend a significant portion of its time in the external
library.  It is not generally possible to use the <code><span class="nolinebreak">OCTAVE_QUIT</span></code><!-- /@w --> macro
in this case.  The alternative in this case is
</p>
<div class="example">
<pre class="example">BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
&hellip;  some code that calls a &quot;foreign&quot; function &hellip;
END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
</pre></div>

<p>The disadvantage of this is that if the foreign code allocates any
memory internally, then this memory might be lost during an interrupt,
without being deallocated.  Therefore, ideally Octave itself should
allocate any memory that is needed by the foreign code, with either the
fortran_vec method or the <code><span class="nolinebreak">OCTAVE_LOCAL_BUFFER</span></code><!-- /@w --> macro.
</p>
<p>The Octave unwind_protect mechanism (<a href="The-unwind_005fprotect-Statement.html#The-unwind_005fprotect-Statement">The unwind_protect Statement</a>)
can also be used in oct-files.  In conjunction with the exception
handling of Octave, it is important to enforce that certain code is run
to allow variables, etc. to be restored even if an exception occurs.  An
example of the use of this mechanism is
</p>
<div class="example">
<pre class="verbatim">#include &lt;octave/oct.h&gt;
#include &lt;octave/unwind-prot.h&gt;

void
my_err_handler (const char *fmt, ...)
{
  // Do nothing!!
}

DEFUN_DLD (unwinddemo, args, nargout, &quot;Unwind Demo&quot;)
{
  octave_value retval;
  int nargin = args.length ();

  if (nargin &lt; 2)
    print_usage ();
  else
    {
      NDArray a = args(0).array_value ();
      NDArray b = args(1).array_value ();

      if (! error_state)
        {
          // Declare unwind_protect frame which lasts as long as
          // the variable frame has scope.
          unwind_protect frame;
          frame.protect_var (current_liboctave_warning_handler);

          set_liboctave_warning_handler (my_err_handler);
          retval = octave_value (quotient (a, b));
        }
    }
  return retval;
}
</pre><pre class="example">
</pre></div>

<p>As can be seen in the example:
</p>
<div class="example">
<pre class="example">unwinddemo (1, 0)
&rArr; Inf
1 / 0
&rArr; warning: division by zero
   Inf
</pre></div>

<p>The warning for division by zero (and in fact all warnings) are disabled in the
<code>unwinddemo</code> function.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Documentation-and-Test-of-Oct_002dFiles.html#Documentation-and-Test-of-Oct_002dFiles" accesskey="n" rel="next">Documentation and Test of Oct-Files</a>, Previous: <a href="Input-Parameter-Checking-in-Oct_002dFiles.html#Input-Parameter-Checking-in-Oct_002dFiles" accesskey="p" rel="prev">Input Parameter Checking in Oct-Files</a>, Up: <a href="Oct_002dFiles.html#Oct_002dFiles" accesskey="u" rel="up">Oct-Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>