質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

610閲覧

try, throwで投げた値の型とcatchで受け取る型が整合しない場合の、Visudal Studioの挙動が分からない

saku26

総合スコア7

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/06/28 14:22

C++の初学者です。
Visual Studio 2017にて、VC++でコンパイルしています。

throwで整数を投げて、
catchでは、あえてdoubleしか受け取らないようにしています。

C++

1#include <iostream> 2 3int main() 4{ 5 std::cout << "Don't type 0.>"; 6 7 int input; 8 std::cin >> input; 9 10 try { 11 throw input; 12 } 13 catch(double &i){ 14 std::cout << i; 15 } 16}

この場合、int型はcatchされないので、std::cout << i; は無視されると理解しているのですが、Visual Studio 2017でLocal Windows Debuggerで実行した際、図のように
"Unhandled exception at 0x74ED46D2 in section26.exe: Microsoft C++ exception: int at memory location 0x00B9FD00."
なるメッセージが表示されます。
なぜこのような挙動になるのか、プログラムに問題があるのかが分からず困っております。

イメージ説明

ちなみに、プロジェクトをBuildして作成されるsection26.exeを直接実行すると、エラーは発生せず、
std::cout << i;
も実行されていないため、意図通り動作しているようではあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Unhandled exception

未処理の例外

catch されない例外(未処理の例外)が発生した場合は、規定のterminate functionが呼び出され処理が中断(abort)されます。
※以下公式ドキュメントですが日本語訳が機械翻訳なので原文読まれた方がわかりやすいと思います。
規定のterminate functionは、set_terminate() で独自の物に変更することが可能です。

(docs.microsoft.com)未処理の C++ 例外

現在の例外に一致するハンドラー (または省略記号ハンドラー) が見つからない場合は、 catch 定義済みの terminate ランタイム関数が呼び出されます。


補足追記です。

ちなみに、プロジェクトをBuildして作成されるsection26.exeを直接実行すると、エラーは発生せず、

std::cout << i;
も実行されていないため、意図通り動作しているようではあります。

正確には意図通り動作していません。
以下のように、try{}catch(){}の後に処理があった場合terminate function内でabortするため、その処理は行われません。

C++

1// ・・・略・・・ 2 try { 3 throw input; 4 } 5 catch(double &i){ 6 std::cout << i; 7 } 8 9 std::cout << "Finish."; 10}

投稿2021/06/28 14:51

編集2021/06/28 15:04
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2021/06/28 15:37

再現出来る環境ないので憶測ですが、Unhandled exceptionになった場合、 プロセスの終了コードは3に設定されるのかな? https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/reference/abort > Windows エラー報告ハンドラーが呼び出されていない場合、 abort は _exit を呼び出して終了コード3でプロセスを終了し、親プロセスまたはオペレーティングシステムに制御を戻します。 > _exit は、ストリームバッファーをフラッシュせず、atexit/_onexit 処理を行いません。
saku26

2021/06/30 04:49

なるほど、terminate functionというものが実行されるのですね。大変勉強になりました。 参考書では、catchしたものしか実行しないという説明で、catchされない場合の説明がなかったのですが、これで理解できました。
guest

0

間違っていないと思いますが……

Unhandled exception at 0x74ED46D2 in section26.exe: Microsoft C++ exception: int at memory location 0x00B9FD00. [訳] ハンドルされていない例外。

intで投げているため、捕捉されず、デフォルトのterminatorが起動しただけでは?

投稿2021/06/28 14:40

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

catchされない例外は例外メッセージがでます。
それがでてるだけなのでは。

投稿2021/06/28 14:38

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問