趣味でC++やっています。
Qtについてなのですが、Qtを使うときは例外は投げることができないのでしょうか?
最初、QListWidgetを継承して "リストのアイテムが選択されたら..."等の挙動を指定できるように
QtUse::QtWindow::ListBoxクラス ( QtUse::QtWindow は namespace ) を定義して、
コンストラクタで行う処理を記述したクラスを渡して...という感じでやりました。
で、int QListWidget::getIndex( const QString &text ) というメンバ関数があるとします。
引数として受け取った文字列があるインデックスを返すものです。
このとき、その文字列が QListWidget内にない場合、処理不可能なので std::exceptionを継承した例外クラスを投げました。
すると ランタイムエラーが出ました。
例外を投げなくていい範囲 ( QListWidgetにある文字列 ) にしてみると普通にOK。
情報元は忘れましたが、なんかのサイトで「Qtのスレッド( QThread ) に渡すスレッドから例外を投げるとクラッシュする」というような記事を見た覚えがあります。
Windows APIのスレッド起動も begin_threadでしたっけ? beginが含まれている関数に関数ポインタとして渡すので、
例外が投げられると受け手がいないので例外が補足されず、クラッシュ。
これは理解できます。
なので C由来の方法 ( -1 や 空文字列 等 のようなでたらめな値かどうかをチェックする方法 ) でやるとします。
ここまではまだいいです。
問題はそれ以外の場所から例外を投げる場合です。
QtUse::QtWindow::ListBox等とは別に
CMainクラスを定義します。
サンプルコードとかだと QMainWindowを継承して挙動の定義をするクラスです。
C++
1// IListBoxEventクラスは ListBoxのイベント処理用のインターフェースクラス。 2 3class CMain : IListBoxEvent, 4 /* ... 他にもイベント処理用インターフェースを継承 */ { 5 public: 6 CMain(){ 7 // 生成等 8 } 9 10 ~CMain(){ 11 12 } 13 14 // 関数オブジェクト ( ファンクタ ) にするため。 15 bool opeator()( int argc, char *argv[] ){ 16 init(); 17 18 uinit(); 19 // 他にもあるが... 20 } 21 22 bool buttonClicked(){ 23 24 } 25 26 bool listItemChecked(int index){ 27 28 } 29 30 // 他にもイベント系あり 31 protected: 32 33 bool init( void ){ 34 // ListBox等の生成や設定 35 } 36 37 bool uninit( void ){ 38 // 破棄用 39 } 40 41 ... 42}; 43 44int main( int argc, char *argv[] ){ 45 CMain Main; 46 return Main( argc, argv ); 47}
という風にしています。( 厳密には所々違いますが、サンプルなので。 )
で、このCMainに funcメンバ関数 ( 中身はただ単に例外を投げるだけ )を追加して試してみました。
// これを CMainに追加
void func( void ){
throw -1; // 動くかどうかのテストなのでint型を投げてみた..
}
このfuncメンバ関数を operator()等で例外処理を伴って記述しても
ListBoxのときみたいな Runtime-error が発生します。
Qtには QExceptionという例外クラスがあるようですが、
必ずこれじゃないと無理なのでしょうか?
自分用のライブラリ( CUIでは使えた。例外を投げるクラスや関数がある。 ) を使うことは無理なのでしょうか?
QException ( for Qt ) を使えばいいのかもしれませんが、CUI版はできればその実行ファイルさえあればいいようにしたいので...
( Qtを使うとDLLが多すぎる。 "DLL"ディレクトリを実行ファイルと同じディレクトリにおいてそこに入れる...っていうこともできないし...
( また、std::exception から QExceptionに変更するの大変... メンバが違うし... )
もしQExceptionを使わずに例外を発生させてもOKなやり方があればご教授お願い致します。
[情報]
言語: C++
コンパイラ: MinGW
Qtバージョン: 5.6
QtCreator: 使用しない ( 設定がわけわからん... )
宜しくお願い致します。
追記:
例えば、上記でいえばbuttonClickedメンバ関数 ( メッセージを受け取った際に動かすメンバ ) 内で、
C++
1try{ 2 func(); // 例外が投げられる可能性がある( 今回は必ず投げますが。 )関数 3}catch( int e ){ 4 // ここで表示 5}
としていますが、なぜかクラッシュします。
投げられた例外の型は同じなのに...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/10 08:11
2017/11/10 08:13
2017/11/17 03:06
2017/11/17 03:16