プログラム言語 例外処ç†

概è¦

・例外(エラー)を補足
・処ç†ã‚’æ­¢ã‚ã‚‹ã“ã¨ãªãエラーã®å†…容を呼ã³å‡ºã—元サブルーãƒãƒ³ã¸è¿”ã™
・サブルーãƒãƒ³é–“ã§ã¯ä¾‹å¤–ç”¨ã®æˆ»ã‚Šå€¤ã‚„引数を設計ã™ã‚‹å¿…è¦ã¯ãªã„。

従æ¥ã®ã‚¨ãƒ©ãƒ¼å‡¦ç†ã¨ã®æ¯”較

error1

従æ¥ã®ã‚¨ãƒ©ãƒ¼å‡¦ç†

â‘ A: Bを呼ã³å‡ºã™
â‘¡B: Cを呼ã³å‡ºã™
 ※エラー発生
â‘¢C: エラーコード判定。Bã«ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™å‡¦ç†
â‘£B: エラーコード判定。Aã«å—ã‘å–ã£ãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™å‡¦ç†
↓
A: å—ã‘å–ã£ãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«å¿œã˜ãŸå‡¦ç†
å•題点
エラーコード判定処ç†åŠã³ã€è¿”ã™å‡¦ç†ã‚’複数ã®ã‚µãƒ–ルーãƒãƒ³ã«æ›¸ã‹ãªãã¦ã¯ãªã‚‰ãªã„。
書ã忘れã€è¨˜è¿°ãƒŸã‚¹ã€ã‚µãƒ–ルーãƒãƒ³ã®è¿½åŠ ã€ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã®å¢—減・変更等ã«å¿œã˜ã¦ã‚µãƒ–ルーãƒãƒ³ã®ã‚¨ãƒ©ãƒ¼å‡¦ç†ã‚’修正ã™ã‚‹å¿…è¦ãŒã‚る。

改善ã•れãŸã‚¨ãƒ©ãƒ¼å‡¦ç†

â‘ A: Bを呼ã³å‡ºã™
â‘¡B: Cを呼ã³å‡ºã™
 ※エラー発生
â‘¢C: Bã«ã€Œä¾‹å¤–ã€ã‚’渡ã™
â‘£B: Aã«ã€Œä¾‹å¤–ã€ã‚’渡ã™
↓
A: å—ã‘å–ã£ãŸã€Œä¾‹å¤–ã€ã«å¿œã˜ãŸå‡¦ç†
å•題点
・「例外ã€ã‚’呼ã³å‡ºã—å…ƒã®ã‚µãƒ–ルーãƒãƒ³ã«ãã®ã¾ã¾è¿”ã™ã ã‘。
記述ã¯ã‚µãƒ–ルーãƒãƒ³é–“ã§å…±é€šã€‚修正ã®å¿…è¦ãªã—。

使用例

例外ãŒç™ºç”Ÿã™ã‚‹ã‚¯ãƒ©ã‚¹ã‚’利用ã™ã‚‹å ´åˆ
public static InputStream newInputStream(~) throws IOException
{
  ~
}

パターン① throw
public static void main(String[] args) throws IOException {
 String ret = method();
}

private static String method() throws IOException {
 File file = new File("C:\\test.txt");
 Path path = file.toPath();
 InputStream stream = Files.newInputStream(path);
 return stream.toString();
}

パターン② try catch
public static void main(String[] args) {
 String ret = method();
}

private static String method() {
 File file = new File("C:\\test.txt");
 Path path = file.toPath();
 InputStream stream;
 try {
  stream = Files.newInputStream(path);
  return stream.toString();
 } catch (IOException e) {
  return null;
 }
}

パターン③ try with resources
public static void main(String[] args) {
 String ret = method();
}

private static String method() {
 File file = new File("C:\\test.txt");
 try (InputStream stream = Files.newInputStream(file.toPath())) {
  return stream.toString(); 
 } catch (IOException e) {
  return null;
 }
}

public void myForm_Load(object sender, EventArgs e)
{
  try
  {
    SubRoutine();
  }
  catch (Exception ex)
  {
    MessageBox.Show(text:ex.Message, caption:System.Reflection.MethodBase.GetCurrentMethod().ToString());
  }
}

private void SubRoutine()
{
  try
  {
    //例外を発生ã•ã›ã‚‹
    throw new System.IO.FileNotFoundException(message: “ファイル無㗔);

    throw new System.Exception(message:”エラー全般”);

  }
  catch(System.IO.FileNotFoundException){
    //ファイル無ã—
    throw; //外ã¸ã‚¨ãƒ©ãƒ¼æƒ…報を渡ã™
  }
  catch(System.IO.IOException){
    //ロック
    throw; //外ã¸ã‚¨ãƒ©ãƒ¼æƒ…報を渡ã™
  }
  catch(System.UnauthorizedAccessException){
    //アクセス権é™ãªã—
    throw; //外ã¸ã‚¨ãƒ©ãƒ¼æƒ…報を渡ã™
  }
  catch (System.Exception)
  {
    //ãã®ä»–ã®ã‚¨ãƒ©ãƒ¼
    throw; //外ã¸ã‚¨ãƒ©ãƒ¼æƒ…報を渡ã™
  }
  finally
  {
    //エラー有無ã«é–¢ã‚らãšå¿…ãšå®Ÿè¡Œã•ã›ã‚‹å‡¦ç†(å„種Close処ç†ç­‰)
  }
}

try
{
 throw "エラー内容文字列";
}
catch (char *str) {
 cout << str;
}

Private Sub myForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  Try

    Call subRoutine()

  Catch ex As Exception
    Call MessageBox.Show(ex.Message, Reflection.MethodBase.GetCurrentMethod.Name)
    ’SubRoutine()ã§ã®ä¾‹å¤–メッセージãŒè¡¨ç¤ºã•れる
  End Try
End Sub

Private Sub SubRoutine()

  Dim sr As IO.StreamReader = Nothing
  Try

    Throw New IO.FileNotFoundException(“ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。”)

    Throw New Exception(“例外処熔)

  Catch ex As IO.FileNotFoundException
    ’ファイルãŒãªã„
    Throw '(外ã®å‡¦ç†ã«ä¾‹å¤–メッセージを渡ã™)

  Catch ex As IO.IOException
    ’ファイルロック時
    Throw '(外ã®å‡¦ç†ã«ä¾‹å¤–メッセージを渡ã™)

  Catch ex As UnauthorizedAccessException
    ’アクセス権ãŒãªã„      
    Throw '(外ã®å‡¦ç†ã«ä¾‹å¤–メッセージを渡ã™)

  Catch ex As Exception
    ’ãã®ä»–
    Throw '(外ã®å‡¦ç†ã«ä¾‹å¤–メッセージを渡ã™)

  Finally
    ’確実ã«ãƒ•ァイルを閉ã˜ã‚‹
    If Not sr Is Nothing Then
      sr.Close()
    End If
  End Try
End Sub

'例外発生時:次ã®è¡Œã¸ç§»ã‚‹
OnErrorResumeNext

'例外発生時:指定行ã¸ç§»å‹•
OnErrorGoTo ERR_TRAP

  Exit Sub(Function)

ERR_TRAP:
  'エラー番å·ã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—
  Call MsgBox(Error(Err.Number))

use Exception;
try {

 if (~) return;

} catch (\Exception $e) {
 エスケープ必è¦ï¼ï¼
 $msg = $e->getMessage();
 $trace = $e->getTraceAsString();

 throw new Exception($e->getMessage());
} finally {
 ~
}

import sys

def test():
  try:
    例外を発生ã•ã›ã‚‹
    raise Exception('エラーメッセージ')
  except Exception as err:
    補足ã—ãŸã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
    print(str(err))
    tracebackオブジェクト
    print(sys.exc_info()[0])
    print(sys.exc_info()[1])
    print(sys.exc_info()[2])
    # 例外を上ã«é€ƒãŒã™
    raise
  finally:
    print('end')
  return

try:
  test()
except:
  test()内ã®ä¾‹å¤–を補足

function ErrTest()
{
 try {
  myMethod();
 }
 catch (e) {
  window.alert(e.message);
  // → 作æˆã•れãŸã‚¨ãƒ©ãƒ¼
 } finally {
  ~
 }
}

function myMethod()
{
 try {
  throw new Error('作æˆã•れãŸã‚¨ãƒ©ãƒ¼');
 }
 catch (e) {
  throw e;
 }
}

エラー/ãƒã‚§ãƒƒã‚¯ä¾‹å¤–/éžãƒã‚§ãƒƒã‚¯ä¾‹å¤–

※JAVA
Throwableクラス
(1)Error
 ※電æºã‚„メモリã®å•題等ã€ãƒ—ログラムã§ã¯å¯¾å‡¦ã§ããªã„å•題
  try~catchã®è¨˜è¿°ã¯å¼·åˆ¶ã•れãªã„
  (書ã事ã¯ã§ãã‚‹)
(2)例外
 ※プログラムã§å¯¾å‡¦ã§ãã‚‹å•題
  ①Exception(検査例外)
   ※try~catchã®è¨˜è¿°ãŒå¼·åˆ¶ã•れる例外
    try~chatchã®è¨˜è¿°å¿˜ã‚Œã‚’防ã為ã«è¨€èªžä»•様ã¨ã—ã¦å®šã‚られãŸä¾‹å¤–
  ②RuntimeException(éžæ¤œæŸ»ä¾‹å¤–)
   ※try~catchã®è¨˜è¿°ãŒå¼·åˆ¶ã•れãªã„例外
   (書ã事ã¯ã§ãã‚‹)
以下ã®ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¯ã‚³ãƒ³ãƒ‘イルエラー
public static void main(String[] args) {
  method();
}
private static void method()
{
  String filename = "C:\test.txt";
  FileReader reader = new FileReader(filename);
}
FileReaderクラスã®ãƒ¡ã‚½ãƒƒãƒ‰(コンストラクタ)ã¯æ¤œæŸ»ä¾‹å¤–ã§ã‚ã‚‹FileNotFoundExceptionãŒç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚る。
ãã®ç‚ºã€ä»¥ä¸‹ã®å¯¾ç­–ã‚’æ–½ã™å¿…è¦ãŒã‚る。
(1)ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’try~catchã§å›²ã‚€
(2)throwsã§å‘¼ã³å‡ºã—å…ƒã¸ä¾‹å¤–を渡ã™ã€‚
(1)public static void main(String[] args) {
  method();
}
private static void method()
{
  String filename = "C:\test.txt";
  try {
    FileReader reader = new FileReader(filename);
  } catch (FileNotFoundException e) {
    System.out.println(e.getMessage());
  }
}
(2)private static void method() throws FileNotFoundException
{
  String filename = "C:\test.txt";
  FileReader reader = new FileReader(filename);
}
※ã“ã®å ´åˆã€method()ã®å‘¼ã³å‡ºã—å…ƒã§ã¯method()ã«å¯¾ã—ã¦åŒæ§˜ã«ã€
(1)ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’try~catchã§å›²ã‚€
(2)throwsã§å‘¼ã³å‡ºã—å…ƒã¸ä¾‹å¤–を渡ã™ã€‚
ã®å¯¾ç­–ã‚’æ–½ã™å¿…è¦ãŒã‚る。
public static void main(String[] args) {
  try {
    method();
  } catch (FileNotFoundException e) {
    e.getMessage();
  }
}

主ãªä¾‹å¤–一覧(エラー)

java.lang.OutOfMemoryError
メモリーãŒä¸è¶³ã—ãŸå ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.StackOverflowError
スタックオーãƒãƒ¼ãƒ•ロー時ã«ã‚¹ãƒ­ãƒ¼

java.lang.ExceptionInInitializerError。
staticイニシャライザーã§ã®ä¾‹å¤–発生時ã«ã‚¹ãƒ­ãƒ¼
staticイニシャライザーã¯ã‚¯ãƒ©ã‚¹ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ä½œæˆå‰ã«å‡¦ç†ã•れる為ã€
直接JVMã«ä¾‹å¤–を渡ã™

主ãªä¾‹å¤–一覧(検査例外)

Exceptionã®ã‚µãƒ–クラス

java.lang.ClassNotFoundException
クラスãŒè¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã«ã‚¹ãƒ­ãƒ¼

IOExceptionã®ã‚µãƒ–クラス
java.io.FileNotFoundException
ファイルãŒå­˜åœ¨ã—ãªã„。開ã‘ãªã„å ´åˆã«ã‚¹ãƒ­ãƒ¼

java.io.file.FileAlreadyExistsException
ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ—¢ã«å­˜åœ¨ã—ã¦ã„ã‚‹å ´åˆã«ã‚¹ãƒ­ãƒ¼

java.io.file.DirectoryNotEmptyException
ディレクトリーãŒç©ºã§ãªã„å ´åˆã«ã‚¹ãƒ­ãƒ¼

java.io.file.NoSuchFileException
ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«ã‚¹ãƒ­ãƒ¼

主ãªä¾‹å¤–一覧(éžæ¤œæŸ»ä¾‹å¤–)

java.lang.RuntimeException ã®ã‚µãƒ–クラス

java.lang.ClassCastException
変æ›ã§ããªã„クラスã¸ã‚­ãƒ£ã‚¹ãƒˆã—よã†ã¨ã—ãŸå ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.IllegalArgumentException
ãƒ¡ã‚½ãƒƒãƒ‰ã«æ¸¡ã•れãŸå¼•æ•°ãŒæƒ³å®šå¤–ã®å€¤ã®å ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.NullPointerException
オブジェクトã®å€¤ãŒnullã®æ™‚ã€ãã®ã‚ªãƒ–ジェクトã®ãƒ¡ãƒ³ãƒå¤‰æ•°ã‚„メソッドをå‚ç…§ã—ãŸå ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.IllegalStateException
メソッドã®å‘¼ã³å‡ºã—ã«å¯¾ã—ã¦ã‚ªãƒ–ジェクト状態ãŒä¸æ­£(インスタンス化ã•れã¦ã„ãªã„ç­‰)

java.lang.IndexOutOfBoundsException
オブジェクト(é…åˆ—ã€æ–‡å­—列等)ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹(インデックス)ãŒç¯„囲外ã§ã‚ã‚‹å ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.StringIndexOutOfBoundsException
文字列ã«å¯¾ã—ã¦èª¤ã£ãŸæ–‡å­—ä½ç½®ã‚’指定ã—ãŸå ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.NumberFormatException
文字列を数値型ã«å¤‰æ›ã—よã†ã¨ã—ãŸæ™‚ã€æ–‡å­—列ã®å½¢å¼ãŒæ­£ã—ããªã„å ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.ArithmeticException
整数演算時ã€ï¼ã§é™¤ç®—ã—ãŸå ´åˆã«ã‚¹ãƒ­ãƒ¼

java.lang.SecurityException
セキュリティーマãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã«ã‚ˆã£ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼é•åã¨åˆ¤å®šã•れãŸå ´åˆã«ã‚¹ãƒ­ãƒ¼

アサーション

プログラマーã®ãƒŸã‚¹ã‚’発見ã™ã‚‹ç‚ºã®ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯
assert ~

assert 1==2
例外ãŒç™ºç”Ÿã™ã‚‹
assert 1==1
何も起ã“らãªã„

アサーションを無効化ã—ã¦å®Ÿè¡Œã™ã‚‹æ–¹æ³•
python ~.py
assert命令ãŒå®Ÿè¡Œã•れる
python -O ~.py
assert命令ãŒç„¡è¦–ã•れる

Follow me!