0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

例外勉強メモ

Last updated at Posted at 2018-09-03

例外の書き方を1時間で勉強してまとめたメモ

一般

どういった基準で例外を書くべきなんだろう?

  • 例外を乱用しない

例外は呼び出す側がINPUTの条件を満たしているが、呼び出された側でOUTPUTの条件を満たせなくなったときに投げる

by 業務でWebサービス開発をする際に気をつけたいこと(新卒向け)

 

  • コードの可読性が上がる

正常系と異常系の処理が混じっている ためコードが読みにくい。
by もう少し例外を使用しても良いのではないか...

null安全

null 安全 (または null 安全性 )は null safety の訳語です。 null safety という用語は主に Kotlin コミュニティで使われているもので、言語によって Optional や Option, Maybe, nullable type などの型で実現できる、 null が原因で実行時エラーを起こさない性質のことを表します。そのような性質を表す言葉として null 安全 はぴったりだと思うので、本投稿では null 安全 という呼び方を採用します。
by null安全でない言語は、もはやレガシー言語だ

つまり…どういうことだってばよ?

本来「nullが渡されるケースは設計上意味を持たない」にもかかわらず、万が一のNullPointerExceptionを避けるためだけに、nullが渡された場合の処理を何かしら書かなければならないのです。
by 「null安全」とは――Javaプログラマーが血と汗と涙を流さなくてすむ理由

なるほど!たしかに、単体テストの時にcatchに入るためにnull代入とかしてた時、「でもここにnull入るわけないよなぁ…」とか思ってました。
null安全は冗長な例外設計を避けることに寄与する技術なんですね(それだけではないでしょうが)。

C++

基本的な例外処理

try {
	//例外が発生する可能性のあるプログラムコード
}catch (type arg) {
	//例外処理
}

try ブロックないで例外が発生した場合 catch ステートメントでそれを受け取ります
catch ステートメントが適切な例外を受け取り、用意された例外処理を行います

例外の投げ方

throw exception;
exceptionは例外の値を指定する。
⇒catch側の例外の型と合わせる必要がある。

例:

try {
	throw Exception(1);
}catch (Exception e) {
	//例外処理
}

デフォルトの例外

catch(...)
全ての型の例外を受け取ることが可能。

例外指定(C++11で非推奨, C++17で削除)

C++では、関数に例外指定というものが記述できる。これはC++98からある機能で、throw(T1, T2, ...)という文法で、関数が外に投げる例外を指定する機能だ。
もし、関数が例外指定に指定された以外の型を投げた場合、std::unexpectedが呼ばれる。

void f() throw( int ) 
{
    throw 0 ; // OK
    throw 0.0 ; // 実行時エラー: call std::unexpected() 
}

by C++の例外指定

void unexpected()

何らかの理由で例外を破棄する必要がある場合に呼び出されます
この関数は、abort() を呼び出してプログラムを以上終了させます
by 例外処理

noexcept

void f() throw( ) ;

ある主要なC++コンパイラーは、この記述を、関数は例外を外に投げないという意味にみなし、最適化のためのヒントに使い始めた。

C++11では、無例外保証の指定機能だけに特化した、noexceptが追加された。noexceptを指定すると、関数は外に例外を投げないと指定したことになる。
by C++の例外指定

大部分の関数は現実にはnoexcept宣言しない。(例外は投げるかもしれない)
by Effective Modern C++ メモ

自然な実装で例外が発生しない場合は、noexceptによって呼び出し元に迷惑をかけない事を保証出来る。

C++17 からは noexcept は関数の型の一部という扱いになる (noexcept が付いているのとついていないのとでは異なる型と認識される) ので、関数が例外を投げるか否かについて従来よりも厳密な運用が要求されることになります。
by コメント(SaitoAtsushiさん)より

C++17からは関数型の一部になるということなので、知らないとコンパイルエラーを量産することになりそうです。例外の有無についてはちゃんとメリハリつける必要がありますね。

std::optional

C++17~でのnull安全モジュール

その他

初心者が1時間で調べたことをまとめているだけなので、すっからかんだと思われます…

有識者の方、ご指摘頂ければ大変有り難く思います。

0
1
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?