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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

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

Q&A

解決済

4回答

4219閲覧

C# try catchの変数

onGu

総合スコア21

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

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

0グッド

0クリップ

投稿2019/04/04 01:23

下記コードで変数宣言は外でしていますが、try内の変数を外で操作できません。
switchの終わりまでtryにすると実行できるのですが、宣言場所に問題があるのでしょうか?

using 省略

namespace trycatch
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e) { string mt1; string st1; string strTime1; string strTime2; try //StreamReaderだけをtryにすると外でmt1をいじれない { StreamReader sr1 = new StreamReader(@"d:\1sample.txt",                              Encoding.GetEncoding("Shift_JIS")); mt1 = sr1.ReadToEnd(); sr1.Close(); } catch (Exception ex) { label1.Text = ex.Message; } StreamReader sr2 = new StreamReader(@"d:\2sample.txt",                            Encoding.GetEncoding("Shift_JIS")); st1 = sr2.ReadToEnd(); sr2.Close(); strTime1 = mt1.Substring(10, 28); //ここでエラー strTime2 = st1.Substring(10, 28); switch (strTime1.CompareTo(strTime2)) { case -1: textBox1.Text = "strTime1はstrTime2より前の日時です"; break; case 0: textBox1.Text = "strTime1はstrTime2は同じ日時です"; break; case 1: textBox1.Text = "strTime1はstrTime2より後の日時です"; break; } } }

}

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

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

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

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

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

YAmaGNZ

2019/04/04 01:30

エラーというのは、コンパイル時のエラーですか?実行時のエラーですか? また、エラーメッセージは何ですか?
guest

回答4

0

ベストアンサー

mt1のところでエラーと書いているのがコンパイルエラーで
「未割り当てのローカル変数 'mt1'が使用されました」
というものであれば、try-catchの外だから使用できないというわけではありません。

C#

1try 2{ 3 StreamReader sr1 = new StreamReader(@"d:\1sample.txt",Encoding.GetEncoding("Shift_JIS")); 4 5 mt1 = sr1.ReadToEnd(); //ファイルがない場合などでこの行が実行されずmt1が初期化されない 6 sr1.Close(); 7} 8catch (Exception ex) 9{ 10 label1.Text = ex.Message; 11}

ここで、d:\1sample.txtがない場合などの例外が発生した場合、mt1は初期化されない状態となります。
このような初期化されないルートがあるので、ダメですよとエラーが発生している状態です。

投稿2019/04/04 01:54

編集2019/04/04 01:56
YAmaGNZ

総合スコア10258

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

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

onGu

2019/04/04 02:21

すべての変数を="";で初期化したら赤波線「未割り当てのローカル変数 'mt1'が使用されました」が消えました。低レベルの質問に丁寧に回答いただき感謝です。ありがとうございました。
guest

0

try catch に限らず、スコープを意識したプログラミングが必要です。

私が検索した限り一番良い文書は↓です。
[雑記] 識別子のスコープとオブジェクトの寿命

理解しにくい場合は、"C# 変数 スコープ"で検索して片っ端から読んでみてください。

投稿2019/04/04 01:50

hihijiji

総合スコア4150

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

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

0

今回の問題は他の回答者の方が言われているようにスコープを意識してないからですね。

今回の問題とは関係ない余計なお世話かもしれませんが、例外処理に関して気になることを一言・・・(こういうコードを見ると黙ってられないのですみません)

とにかくまず Exception をキャッチするのは止めた方がいいです。その他例外処置について、自分的に一般的と思うことを書きます。

(1) 予測可能で正しい業務フローに戻すことができる「業務エラー」(例:ユーザーの入力間違い)と、予測できないもしくは予測はできても何の対応もできない「例外」(例:DB サーバーダウン)を区別して対処。

(2) 「例外」はランタイムに拾わせてアプリケーションを停止させる。

(3) よほどのことがない限り try-catch は書かない。

(4) キャッチせざるを得ない場合でも Execption はキャッチしない。

(5) 間違って補足してしまった例外は throw する。(注:catch ブロックでキャッチした例外を throw するとスタックトレースが途切れるので単に throw と書く)

(6) ユーザーへの通知が必要なら、集約的例外処置を利用する。

詳しくは以下の記事を見てください。

NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

あと、.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも Catch (Exception e) を使用するのはよくない」ということについては以下の記事を見てください。

破損状態例外を処理する
https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx

投稿2019/04/04 02:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

onGu

2019/04/04 02:25

try catch の使い方ご教授ありがとうございます。何かエラーおきたら表示させたいと言うだけで使っしまいました。ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/04/04 02:28

開発時点でしたらそれでもいいと思います。
guest

0

スコープの問題ではないでしょうか?
tryの中で宣言した変数は、tryの中だけでのみ使えるはずです。

投稿2019/04/04 01:37

researcher

総合スコア87

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問