where am I supposed to catch it?
Qtはシグナル/スロット接続を介し例外をスローサポートしていない理由はまさにです。あなたはそれをしようとすると、このメッセージが表示されます:それは言及したよう
Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in Qt. You must reimplement QApplication::notify() and catch all exceptions there.
を、はQApplicationをサブクラス化し、そこにあなたの例外をキャッチすることが可能であるが、それは物事を処理する非常に迷惑な方法になります。
可能ならば、私はそれをスローしないように、カウントを書き換えることをお勧めします。
count()を書き換えられない場合はどうすればよいですか?例えば
、カウント数(サードパーティのライブラリ内の関数の一部は、あなたは何を)使用しているされている場合は?公式Qtライブラリで
ませスロットはスローなので、あなたがスロースロットでサードパーティのライブラリを使用している場合、それはおそらく、それは良いライブラリーではないというサインです。あなたはとにかくそれを使用したい場合、私はあなたの代わりにアダプターを作成することを、QApplication::notify
でそれを引くのではなく、それをお勧めします。
これはどういう意味ですか?最初に、コンストラクタでスケッチしたサードパーティオブジェクトを取り込むオブジェクトを作成します。その中に、try/catchブロックで投げスロットへの呼び出しをラップするスロットを書きます。今、代わりに大ざっぱサードパーティのオブジェクトのスロットに接続するので、新しく作成したオブジェクトのスロットに接続します。
このように例外をキャッチすると、関連するコードがまとめられ、これらの問題のある関数が2つ以上ある場合は、QApplication::notify
が無関係のtry/catchブロックでいっぱいになるのを防ぎます。例えば
:あなたはどこからでもスローされる可能性が何かを処理したい場合はどう
class BadCounter {
Q_OBJECT
public slots:
void count() { throw CounterError("unable to count"); }
};
class CounterAdaptor {
Q_OBJECT
BadCounter* counter_;
public:
CounterAdaptor(BadCounter* counter) {
counter_ = counter;
}
public slots:
void count() {
try {
counter_->count();
} catch (const CounterError& e) {
std::cerr << e.what() << std::endl;
}
}
};
int main() {
BadCounter engine;
CounterAdaptor adaptor(&engine);
QThread* thread = new QThread();
connect(thread,SIGNAL(started()),&adaptor,SLOT(count()));
thread.start();
... // etc...
delete thread;
}
?
このようなグローバルな問題の明白な例は、予期しない例外です。間違いはどこでも起こり得る。原因を特定して修正できるように、できるだけ多くのイベントの詳細を記録することが望ましいでしょう。この場合、はjichi's answerのように独自のサブクラスでQApplication::notify
を再実装します。グローバルな問題にグローバルハンドラを使用することはかなり妥当です。誰かがはQApplicationを上書きするサンプルコードを必要とする場合
たぶん、あなたは、count()関数でtry-catchブロックを置く必要があります。 .. – Kobe
#vBxカウントスロー – smallB
質問で提供されたあなたの解決策は良いです – Kobe