162 lines
12 KiB
HTML
162 lines
12 KiB
HTML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
|
|
<!-- generated by to_html.pl from try.xml -->
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|
<title>例外処理</title>
|
|
<meta name="author" content="W.Dee" />
|
|
<meta http-equiv="Content-Style-Type" content="text/css" />
|
|
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
|
<link href="browser.css" type="text/css" rel="stylesheet" title="吉里吉里関連リファレンス用標準スタイル" />
|
|
<link href="mailto:[email protected]" rev="Made" />
|
|
<link href="index.html" target="_top" rel="Start" title="トップページ" />
|
|
</head>
|
|
<body>
|
|
<h1><a id="id373" name="id373">例外処理</a>
|
|
</h1><div class="para"><div>
|
|
<a id="id374" name="id374" class="targanchor"><dfn>例外</dfn></a>とは、通常の処理では考えられないような、いわゆる「例外」のことで、多くの場合「エラー」と同じと考えてください。<br />
|
|
</div></div>
|
|
<h1><a id="id375" name="id375">例外が発生する場所</a>
|
|
</h1><div class="para"><div>
|
|
プログラム中のどこでも例外が発生する可能性があります。<br />
|
|
例外を発生させることを「例外を投げる(throw)」ともいいます。<br />
|
|
たとえば、以下のスクリプトがエラーを起こしたとします。<br />
|
|
<br />
|
|
|
|
<br />
|
|
<code class="bq"><span class="weak">例:</span><br /> "3%0"!; <span class="comment">// "0 で除算をしようとしました" 例外が発生する</span></code>
|
|
<br />
|
|
|
|
<br />
|
|
このように 明らかに例外が発生する場合もありますが、発生するかしないかわからない場合もあります。<br />
|
|
</div></div>
|
|
<h1><a id="id376" name="id376">例外の捕捉</a>
|
|
</h1><div class="para"><div>
|
|
<code class="inlinecode"><a id="id377" name="id377" class="targanchor"><dfn>try</dfn></a></code> (試す) キーワードと、<code class="inlinecode"><a id="id378" name="id378" class="targanchor"><dfn>catch</dfn></a></code> (捕捉) キーワードを使うと、例外を捕捉できます。<br />
|
|
たとえば、上の例で発生するかもしれない例外を捕捉するために、以下のようなスクリプトを書くことができます。<br />
|
|
<br />
|
|
|
|
<br />
|
|
<code class="bq"><span class="weak">例:</span><br /> try <span class="comment">// 例外が発生するするかもしれないので</span><br />
|
|
{<br />
|
|
func1(); <span class="comment">// ここでは例外が発生するかもしれない</span><br />
|
|
}<br />
|
|
catch <span class="comment">// 例外を捕捉する</span><br />
|
|
{<br />
|
|
<span class="comment">// 例外がおきたとき、ここが実行される</span><br />
|
|
inform("画像を読み込むことができません。"); <span class="comment">// メッセージを表示する</span><br />
|
|
}<br />
|
|
</code>
|
|
<br />
|
|
|
|
<br />
|
|
このように、try のブロック内で例外の発生するかもしれない処理を書けば、例外がおきたときに catch のブロックを実行することができます。エラー処理をこのようにすっきりと書くことができます。<br />
|
|
<br />
|
|
try のブロックでなにも例外が起きなかった場合は、catch のブロックも実行されません。<br />
|
|
<br />
|
|
try のブロックでは何でも書くことができます。この例のように、はっきりとその行で例外がおきる可能性があることもありますが、関数呼び出しのそのまた関数呼び出しの先で例外が発生したときも、try ... catch を書いておけば例外が発生した時点でここに戻ってくることができます。<br />
|
|
<br />
|
|
例外が発生した場合は、ブロックの残りの処理は中断され、try のある場所まで戻ってきます。<br />
|
|
<br />
|
|
catch のブロックでまた例外が発生した場合は、例外はこの場所では捕捉されません。そのまま例外は関数呼び出しなどをさかのぼり、もしほかの場所で try で例外の捕捉が行われていればそこで捕捉されます。<br />
|
|
<br />
|
|
例外が投げられてから、catch ブロックに到達する間に別の例外が発生する可能性もありますが、動作は未定義です。<br />
|
|
<br />
|
|
例外がスクリプト内のどこでも捕捉されなかった場合、例外はそのままスクリプトを抜けてアプリケーションに渡され、そこで処理されます。<br />
|
|
<br /><div class="note"><div class="notehead"><span class="noteheadspan">Note</span></div>
|
|
通常、このような例外はエラーとして実行を中断させてしまうので、なるべくエラーが起こりそうな場所には try ... catch を書くことをおすすめします。</div><br />
|
|
</div></div>
|
|
<h1><a id="id379" name="id379">例外オブジェクト</a>
|
|
</h1><div class="para"><div>
|
|
例外に関するさまざまな情報が、<a id="id380" name="id380" class="targanchor"><dfn>Exception</dfn></a> というクラスのオブジェクトとともに投げられてきます。このオブジェクトを例外オブジェクトと呼びます。これを、catch で受け取ることができます。<br />
|
|
たとえば、以下のようなスクリプトを書くことができます。<br />
|
|
|
|
<br />
|
|
<code class="bq"><span class="weak">例:</span><br /> try<br />
|
|
{<br />
|
|
loadImages("nothing.jpeg"); <span class="comment">// 例外が発生するかもしれない処理</span><br />
|
|
}<br />
|
|
catch (e) <span class="comment">// e という変数で例外を受け取る</span><br />
|
|
{<br />
|
|
<span class="comment">// e.message は、例外とともに投げられたメッセージ文字列を表します。</span><br />
|
|
<span class="comment">// これには例外が発生した理由が説明されている場合があります。</span><br />
|
|
inform("画像を読み込むことができません。\n"+e.message);<br />
|
|
}<br />
|
|
</code>
|
|
<br />
|
|
|
|
このように、catch の後の丸カッコ内に受け取る変数を書き、その変数に例外オブジェクトを受け取ることができます。<br />
|
|
この変数のスコープは、catch の次のブロック内で始まり、このブロックとともに終わります。この変数はあらかじめ宣言されている必要はありません。<br />
|
|
</div></div>
|
|
<h1><a id="id381" name="id381">throw ステートメント</a>
|
|
</h1><div class="para"><div>
|
|
例外を投げることもできます。例外を投げるには <code class="inlinecode"><a id="id382" name="id382" class="targanchor"><dfn>throw</dfn></a></code> キーワードを使います。<br />
|
|
たとえば、以下のようなスクリプトを書くことができます。<br />
|
|
|
|
<br />
|
|
<code class="bq"><span class="weak">例:</span><br /> function pow2(n)<br />
|
|
{<br />
|
|
<span class="comment">// 2 の n 乗を計算する n は正の整数でなければならない</span><br />
|
|
if(n<0) throw new Exception("負の数は指定できません。");<br />
|
|
<span class="comment">// ↑ 例外を発生する</span><br />
|
|
return 1<<n;<br />
|
|
}<br />
|
|
</code>
|
|
<br />
|
|
|
|
この関数の引数に -1 など、負の数が渡された場合、例外が発生します。例外を投げているのは以下のステートメントです。<br />
|
|
<br />
|
|
|
|
<br />
|
|
<code class="bq">throw new Exception("負の数は指定できません。");</code>
|
|
<br />
|
|
|
|
<br />
|
|
<code class="inlinecode">new Exception("負の数は指定できません。")</code> についてですが、これは Exception クラスのオブジェクトを、文字列を引数にして作成しています。詳しくは Exception クラスを参照してください。そして、この新しく作成されたオブジェクトを throw キーワードで投げています。<br />
|
|
throw キーワードで投げることができるのは Exception クラスのオブジェクトとは限りません。数値でも文字列でも、関数への参照を投げることもできます。しかし、Exception クラス、またはそれから派生したクラスのオブジェクトを投げることが推奨されます。捕捉したときに catch のブロックで、Exception クラスのオブジェクトがくることのみを想定して書けばいいからです。<br />
|
|
</div></div>
|
|
<h1><a id="id383" name="id383">例外を再び投げる</a>
|
|
</h1><div class="para"><div>
|
|
catch で例外を捕捉したのはいいが、まだ例外を受け取る可能性のある try がどこかに宣言されているかもしれない、そのような場合に例外を再び投げることができます。<br />
|
|
以下のようなスクリプトを書くことができます。<br />
|
|
|
|
<br />
|
|
<code class="bq"><span class="weak">例:</span><br /> function tryloadimage()<br />
|
|
{<br />
|
|
try<br />
|
|
{<br />
|
|
primaryLayer.loadImages("test1.bmp"); <span class="comment">// test1.bmp を読んでみる</span><br />
|
|
}<br />
|
|
catch(e)<br />
|
|
{<br />
|
|
inform("画像読み込みに失敗しました。");<br />
|
|
throw e; <span class="comment">// メッセージを表示はするが、例外を再び投げる</span><br />
|
|
}<br />
|
|
}<br />
|
|
<br />
|
|
function test()<br />
|
|
{<br />
|
|
<span class="comment">// tryloadimage を呼び出し、画像読み込みが成功すれば true</span><br />
|
|
<span class="comment">// そうでなければ false を返す関数</span><br />
|
|
try<br />
|
|
{<br />
|
|
tryloadimage();<br />
|
|
}<br />
|
|
catch<br />
|
|
{<br />
|
|
return false;<br />
|
|
}<br />
|
|
return true;<br />
|
|
}<br />
|
|
</code>
|
|
<br />
|
|
|
|
ここで test() を呼び出し、画像読み込みに失敗した場合は、inform メソッドによりメッセージが表示されますが、再び例外が投げられるため、test 関数内の catch により捕捉することができます。<br />
|
|
</div></div>
|
|
<script type="text/javascript" charset="UTF-8" src="documentid.js" ></script>
|
|
<script type="text/javascript" charset="UTF-8" src="postcontent.js" ></script>
|
|
</body>
|
|
</html>
|