例外処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/08/17 05:32 UTC 版)
回復処理
記憶領域の枯渇
処理中に使用可能な記憶領域が枯渇した場合の回復は比較的単純である。
- 大量データを読み込もうとした
- システム全体の短期的な記憶領域枯渇
- システム全体の長期的な記憶領域枯渇
記憶領域が原因として上記が考えられるがGUIプログラムのイベント処理であれば3以外の状況から回復できる。1,2どちらも現在実行中の処理を中断して処理に使った記憶領域を解放すればプロセスを継続できる可能性がある。特に2の状況であればシステムの記憶領域使用状況が回復を待って再度同じ処理を実行することができる。
CUIの場合でかつ複数のファイルを処理しているような場合1の状況から回復することができる。枯渇が発生した大容量ファイルの処理は無理でもその後の小容量ファイルは処理できる可能性がある。
次にSmalltalkによる回復処理の例を示す:
| window textBox filePath open notifyArea |
"ファイルの読み込み失敗を通知する部品"
notifyArea := LabelStringMorph new.
"ファイルを開くための部品"
textBox := TextMorph new.
filePath := TextMorph new.
open := SimpleButtonMorph new.
"ボタンをクリックしたらファイルを読み込んでテキストボックスに表示できるようにする"
open
on: #click
send: #value
to:
[
[
filePath contents asFile withReadStreamDo:
[ :readStream |
textBox contents: readStream contents.
]
]
"
記憶領域が枯渇した場合の回復処理。
処理を中断した上、できるだけ資源を解放したのち使用者に記憶領域の解放を促す。
例外が発生してから例外を捕捉するまでに幾分かの記憶領域が解放される、
解放後ゆとりができていれば回復できるが、ゆとりが無い場合は回復できなくなる場合もある。
"
on: AllocationFailure
do:
[
ObjectMemory compact. "ガーベッジコレクターによる解放"
textBox contents: ''. "途中まで読み込んでしまった文字列を解放"
ObjectMemory compact. "textBox contents分の解放"
notifyArea text: '記憶領域が枯渇しているためファイルを開けませんでした。他のプログラムを終了してから再度実行して下さい。'
].
].
"ファイルを表示するテキストボックスとファイルの読み込みに必要な各種部品を組み込んだWindowを表示する"
window := SystemWindow new.
window
addMorph: textBox;
addMorph: filePath;
addMorph: open;
addMorph: notifyArea;
openInWorld.
- ^ a b “第 5 章 例外処理 (C++ プログラミングガイド)”. docs.oracle.com. 2019年10月26日閲覧。
- ^ a b “IPA ISEC セキュア・プログラミング講座:C/C++言語編 第6章 フェイルセーフ:体系だてたエラーハンドリング”. www.ipa.go.jp. 2019年10月26日閲覧。
- ^ a b “エラー処理をパターンにはめよう”. Codezine. 2019年10月26日閲覧。
- ^ Bjarne Stroustrup. “Appendix E: Standard-Library Exception Safety in "The C++ Programming Language" (3rd Edition).Addison-Wesley, ISBN 0-201-88954-4”. 2013年5月1日閲覧。
- ^ “Exception-Safety in Generic Components”. 2013年5月1日閲覧。
- ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc
- ^ /EH (例外処理モデル)
- ^ ただし、例外処理中にもう一度別のデストラクタから例外が発生してしまうと復帰できなくなるため、デストラクタから例外を発生させるべきではないとされる。
- ^ 例外指定は、 C++関数によって伝達される例外の種類についてプログラマが意図したものを示す言語機能です。 Microsoft Docs Visual C++
- ^ C++17ではこの動的例外仕様が削除される。C++日本語リファレンス
- ^ class StopIteration Ruby 1.9.3 リファレンスマニュアル(2013年10月7日閲覧)。
- ^ 組み込み例外 Python 2.7ドキュメンテーション(2013年10月7日閲覧)。
- ^ module function Kernel.#throw Ruby 1.9.2 リファレンスマニュアル(2013年10月7日閲覧)。
- ^ たとえばCOMではメソッドの戻り値として、MAKE_HRESULT()マクロを用いてHRESULTコードを定義するが、異常系は負数となる。
- ^ CUDAのように列挙型で定義した正の数をエラーコードとして使用するライブラリもある。CUDA Runtime API :: CUDA Toolkit Documentation
- ^ GetFileSize 関数
- ^ GetFileSize function (Windows)
- ^ “C言語規格のドラフト”. 2018年11月21日閲覧。
- 例外処理のページへのリンク