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

package info (click to toggle)
octave3.2 3.2.4-8
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 62,936 kB
  • ctags: 37,353
  • sloc: cpp: 219,497; fortran: 116,336; ansic: 10,264; sh: 5,508; makefile: 4,245; lex: 3,573; yacc: 3,062; objc: 2,042; lisp: 1,692; awk: 860; perl: 844
file content (126 lines) | stat: -rw-r--r-- 5,712 bytes parent folder | download
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
<html lang="en">
<head>
<title>Exception and Error Handling in Oct-Files - Untitled</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Untitled">
<meta name="generator" content="makeinfo 4.11">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Oct_002dFiles.html#Oct_002dFiles" title="Oct-Files">
<link rel="prev" href="Input-Parameter-Checking-in-Oct_002dFiles.html#Input-Parameter-Checking-in-Oct_002dFiles" title="Input Parameter Checking in Oct-Files">
<link rel="next" href="Documentation-and-Test-of-Oct_002dFiles.html#Documentation-and-Test-of-Oct_002dFiles" title="Documentation and Test of Oct-Files">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
</head>
<body>
<div class="node">
<p>
<a name="Exception-and-Error-Handling-in-Oct-Files"></a>
<a name="Exception-and-Error-Handling-in-Oct_002dFiles"></a>
Next:&nbsp;<a rel="next" accesskey="n" href="Documentation-and-Test-of-Oct_002dFiles.html#Documentation-and-Test-of-Oct_002dFiles">Documentation and Test of Oct-Files</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Input-Parameter-Checking-in-Oct_002dFiles.html#Input-Parameter-Checking-in-Oct_002dFiles">Input Parameter Checking in Oct-Files</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Oct_002dFiles.html#Oct_002dFiles">Oct-Files</a>
<hr>
</div>

<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 <kbd>Control-C</kbd> 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 <kbd>Control-C</kbd>,
the <code>OCTAVE_QUIT</code><!-- /@w --> macro is supplied.  For 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>
   <p>The presence of the <code>OCTAVE_QUIT</code><!-- /@w --> macro in the inner loop allows Octave to
treat the user request with the <kbd>Control-C</kbd>.  Without this macro, the user
must either wait for the function to return before the interrupt is
processed, or press <kbd>Control-C</kbd> three times to force Octave to exit.

   <p>The <code>OCTAVE_QUIT</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>OCTAVE_QUIT</code><!-- /@w -->.

   <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>OCTAVE_QUIT</code><!-- /@w --> macro in
this case.  The alternative in this case is

<pre class="example">     BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
     ...  some code that calls a "foreign" function ...
     END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
</pre>
   <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>OCTAVE_LOCAL_BUFFER</code><!-- /@w --> macro.

   <p>The Octave unwind_protect mechanism (<a href="The-_003ccode_003eunwind_005fprotect_003c_002fcode_003e-Statement.html#The-_003ccode_003eunwind_005fprotect_003c_002fcode_003e-Statement">The <code>unwind_protect</code> 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

<pre class="example"><pre class="verbatim">     #include &lt;octave/oct.h>
     #include &lt;octave/unwind-prot.h>
     
     void
     err_hand (const char *fmt, ...)
     {
       // Do nothing!!
     }
     
     DEFUN_DLD (unwinddemo, args, nargout, "Unwind Demo")
     {
       int nargin = args.length();
       octave_value retval;
       if (nargin &lt; 2)
         print_usage ();
       else
         {
           NDArray a = args(0).array_value ();
           NDArray b = args(1).array_value ();
     
           if (! error_state)
             {
               unwind_protect::begin_frame ("Funwinddemo");
               unwind_protect_ptr 
     	    (current_liboctave_warning_handler);
               set_liboctave_warning_handler(err_hand);
               retval = octave_value (quotient (a, b));
               unwind_protect::run_frame ("Funwinddemo");
             }
         }
       return retval;
     }
</pre></pre>
   <p>As can be seen in the example

<pre class="example">     unwinddemo (1, 0)
      Inf
     1 / 0
      warning: division by zero
        Inf
</pre>
   <p>The division by zero (and in fact all warnings) is disabled in the
<code>unwinddemo</code> function.

   </body></html>