[解決済み] C++の例外処理 'char const*'のインスタンスを投げた後に呼び出される Terminate
2022-03-04 01:35:07
質問
エラー: char const*' のインスタンスを投げた後に Terminate が呼び出されました。
アプリケーションを終了させるために、ランタイムが異常な方法でアプリケーションを終了させることを要求しています。アプリケーションのサポートチームに連絡してください。
これをやるとコンパイラがクラッシュする原因がよくわからないのです。何か思い当たることはありますか?プログラミングは少し初めてです。
#include <iostream>
#include <iomanip>
using namespace std;
//Template for Maximum
template <class X>
X Maximum(X arg1, X arg2)
{
if (arg1 > arg2)
return arg1;
else
return arg2;
}
//Template for Minimum
template <class M>
M Minimum(M arg1, M arg2)
{
if (arg1 > arg2)
return arg2;
else
return arg1;
}
/* Template for Divide(D arg1, D arg2) arg1: the dividend arg2: the divisor Description:
Divides arg1 by arg2. If arg2 equals zero then an exception is thrown. */
template <class D>
D Divide(D arg1, D arg2)
{
if (arg2 == 0) {
throw "You cannot devide by zero! ";
}
return (arg1 / arg2);
}
int main()
{
int a, b;
float c, d;
double e, f;
a = 2;
b = 22;
cout << setprecision(4) << fixed << showpoint << "min:" << Minimum(a, b) << "\tmax: " << Maximum(a, b) << endl;
c = 4.7f;
d = 2.97f;
cout << setprecision(4) << fixed << showpoint << "min:" << Minimum(c, d) << "\tmax: " << Maximum(c, d) << endl;
e = 387.78;
f = 387.7798;
cout << setprecision(4) << fixed << showpoint << "min:" << Minimum(e, f) << "\tmax: " << Maximum(e, f) << endl;
e = 40;
f = 0;
try {
cout << setprecision(4) << fixed << showpoint << "Divide: " << e << '/' << f << " = " << Divide(e, f) << endl;
}
catch (string exceptionString) {
cout << exceptionString;
}
system("pause");
return 0;
}
解決方法は?
文字列リテラルは
std::string
. 前者を投げておきながら、後者を捕まえようとする。にもかかわらず
std::string
は文字列リテラルから構築されるかもしれませんが、catch節では起こりません。catch節で許可される変換は、次のセクションで詳しく説明されています。
[except.ハンドル]/3
:
ハンドラは、以下の場合、タイプEの例外オブジェクトにマッチします。
- ハンドラの型が cv T または cv T& で,E と T が同じ型(トップレベルの cv-qualifiers は無視)である,あるいは
- ハンドラが cv T または cv T& 型であり,T が E の曖昧でないパブリックな基底クラスである場合,または
- ハンドラが cv T または const T& 型である場合,T はポインタまたはメンバ型へのポインタ,E はポインタまたはメンバ型へのポインタである. のうちの1つ以上によってTに変換できるものである。
- private、protected、曖昧なクラスへのポインタへの変換を伴わない標準的なポインタ変換。
- 関数ポインタ変換
- 資格変換、または
- ハンドラが cv T または const T& 型である場合,T はポインタまたはメンバ型へのポインタ,E は std::nullptr_t である。
また、リテラル->の場合はどちらも適用されませんでした。
std::string
の変換を行います。
その結果、最終的にその例外はキャッチされず、ランタイムが
std::terminate
キャッチされない例外が発生した場合に想定されるように。
一般的には、専用の例外型(階層の一部かもしれません)を投げ、その型名が発生したエラーを伝えるようにするのがベストでしょう。これにより、ハンドラ(またはハンドラのセット)を書く必要がある場合、より堅牢な方法でエラーを処理することができます。
もし、何らかの理由で標準的なやり方に従いたくない場合は、上記の箇条書きで述べたような変換をしなければなりません。どちらかにすることができます。
-
を投げる。
std::string
リテラル のように"You cannot devide by zero!"s
(ただしs
という接尾辞があります)。 -
をキャッチする
const char*
.
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] std::string を const char* または char* に変換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。