トップ-> C++入門:6章 継承-> 例題)例外クラス

←前ページへ :  トップへ :  次ページへ→

10. 例題)例外クラス

  例外処理は、int型などのデフォルトで定義されている型以外 にも、自分で作ったクラスをthrowすることができる。これを利用して、Exceptionクラスを 基底クラスとし、いくつかの例外を定義します。



Exception.h
#ifndef EXCEPTION_H #define EXCEPTION_H #include<iostream> #include<string.h> using namespace std; class Exception{ friend ostream& operator<<(ostream& os, const Exception& e){ return os << e.m_strExceptionName << " in " << e.m_strSourceFile << " : " << e.m_strLineNumer << endl; } protected: const char* m_strSourceFile; int m_strLineNumer; const char* m_strExceptionName; protected: // コンストラクタ Exception(const char* SourceFile, const int LineNumber): m_strSourceFile(SourceFile), m_strLineNumer(LineNumber) { } // 例外名のセット void SetExceptionName(const char* strExceptionName){ m_strExceptionName = strExceptionName; } }; // 0で割ったときの例外 class DivideByZeroException : public Exception{ public: // コンストラクタ DivideByZeroException(const char* SourceFile, const int LineNumber): Exception(SourceFile, LineNumber) { SetExceptionName( "DivideByZeroException" ); } }; // 添え字が無効 class ArrayIndexOutOfBoundsException : public Exception{ public: // コンストラクタ ArrayIndexOutOfBoundsException(const char* SourceFile, const int LineNumber): Exception(SourceFile, LineNumber) { SetExceptionName( "ArrayIndexOutOfBoundsException" ); } }; #define THROW(_e_) \ { \ _e_ e(__FILE__, __LINE__); \ throw e; \ } #endif // ECEPTION_H
Vector.h
#ifndef _VECTOR_H_ #define _VECTOR_H_ #include<iostream> #include"exception.h" using namespace std; template<class Type> class Vector{ protected: void copy( const Vector<Type>& src ){ size = src.size; vect = new Type[size]; for( int i = 0 ; i < size ; i++ ) vect[i] = src.vect[i]; } // 配列サイズ int size; // 配列本体 Type *vect; public: Vector( int sz = 100 ){ size = sz ; vect = new Type[size] ; } Vector( const Vector<Type>& src ){ copy( src ) ; } virtual ~Vector(){ delete (vect) ; } Type& operator[](int index){ // 添え字のチェック if( index < 0 || index >= size ){ // 無効な添え字の時の例外を投げる THROW(ArrayIndexOutOfBoundsException); } return *(vect + index); } int get_length()const{ return size; } Vector<Type>& operator=( const Vector<Type>& src ){ if( &src != this ){ delete [] vect; copy( src ); } return *this; } }; #endif //_VECTOR_H_
#include<iostream> #include"exception.h" #include"Vector.h" using namespace std; // 割り算関数 // もしかすると例外を投げる可能性があるかもしれない int divide(int n1, int n2){ if( n2 == 0 ) // 0で割ったときの例外を投げる THROW(DivideByZeroException); return n1 / n2; } void main(){ int n1, n2, n3 = 0 ; cin >> n1 >> n2; // 例外が起こるかもしれないブロック try{ Vector<int> vect(5); vect[10] = 10; } // 例外(ArrayIndexOutOfBoundsException)をキャッチ catch(ArrayIndexOutOfBoundsException e){ cerr << e << endl; } // 例外が起こるかもしれないブロック try{ n3 = divide(n1, n2); cout << n1 << " / " << n2 << " = " << n3 << endl; } // 例外(基底クラスなので、Exceptionクラスの派生クラスすべて)をキャッチ catch( Exception e ){ cerr << e << endl; } }
1 0
ArrayIndexOutOfBoundsException in d:\my document\cpp\vector.h : 42

DivideByZeroException in d:\my document\cpp\cpptest.cpp : 10



←前ページへ :  トップへ :  次ページへ→