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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

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

Q&A

解決済

2回答

229閲覧

C#で例外処理がよくわかりません。

BURI55

総合スコア25

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C#

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

0グッド

0クリップ

投稿2019/06/01 05:31

WindowsのコンソールプログラムでiTunesの検索プログラムを作っています。
以下のコードを実行したところ、文字入力は受け付けるのですが、その後プログラムが落ちてしまいます。
例外処理をいれたせいかもしれませんが、どうしたらいいのでしょうか?
実行結果は、iTunesに曲があれば曲名と歌手名他を表示し、なかったらないと表示します。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using iTunesLib; 7namespace test 8{ 9 class Program 10 { 11 static void Main(string[] args) 12 13 { 14 try 15 { 16 iTunesAppClass iTunes = new iTunesAppClass(); 17 18 // ライブラリを取得する 19 // ※この中にはミュージック、ムービー、テレビ番組など全部が含まれる 20 { 21 IITLibraryPlaylist libraryPlaylist = iTunes.LibraryPlaylist; 22 } 23 24 string comment; 25 Console.Write("探す曲名を入力してください。"); 26 comment = Console.ReadLine(); 27 28 29 // ライブラリの音楽ファイルを検索する 30 31 32 var tracks = iTunes.LibraryPlaylist.Search(comment, ITPlaylistSearchField.ITPlaylistSearchFieldSongNames); 33 34 35 36 37 { 38 var track = tracks.ItemByName[comment];//トラックを取得 39 Console.WriteLine(track.Artist + "\t" + track.Name + "がヒットしました。"); 40 } 41 42 43 } 44 45 catch (Exception) 46 { 47 Console.WriteLine("曲は見つかりませんでした。"); 48 } 49 } 50 } 51} 52 53 54 55

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

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

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

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

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

Q71

2019/06/01 05:50

デバッガーで追いかけましたか? 正常に、何も出力するものがないまま終了しているのではないですか?
Q71

2019/06/01 06:15

あと、無闇矢鱈にキャッチしてはいけません。.NET Frame work の例外は、サッカーと同じです。キーパー以外はハンドの反則ですし、キーパーであってもペナルティエリア外や味方からのパスをキャッチしたら反則です。(Exceptionではなく、受ける必要があるものを、最小限の範囲で受ける)
guest

回答2

0

ベストアンサー

「落ちる」っていうのがどういう状況かわかりませんが、Visual Stuidoからデバッグ実行などで実行されているのであれば、全ての処理が「正常に」終了してコンソール画面が閉じられるような気がしますが。

処理の最後にConsole.Read()でも入れてみてはどうでしょう。

あと諸々気になる部分としては

C#

1 // ライブラリを取得する 2 // ※この中にはミュージック、ムービー、テレビ番組など全部が含まれる 3 { 4 IITLibraryPlaylist libraryPlaylist = iTunes.LibraryPlaylist; 5 }

この部分意味あります?
この変数全く使われていませんし、そもそもなんで{}でブロックを作っているのかわかりません。
(その下のコードもそうですが…)

例外処理をいれたせいかもしれませんが、どうしたらいいのでしょうか?

例外というのは、発生した場合に後続の処理を中断し、一番近い(というと語弊があるかも知れませんが)catchまで処理をジャンプするものです。
この辺りはここで全部説明できるような話ではないので、ちゃんとした参考書等を一読されたほうがいいです。

投稿2019/06/01 05:48

gentaro

総合スコア8949

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

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

BURI55

2019/06/01 05:57

落ちるとは入力してエンターキーを押すとプログラムが異常に終了してしまいます。 検索結果などが表示されるはずなのですが。
Q71

2019/06/01 06:01

「異常」とは、どの様な状態ですか?異常ではなく、「期待と違い」ではないですか?
gentaro

2019/06/01 06:02

異常と判断された理由と、その現象の具体的な状況を追記してください。
BURI55

2019/06/01 06:18

Console.Readを入れることで表示されるようになりました。正常だったようです。
guest

0

Exception の中に落ちた原因の情報が入っているのですが、
「曲が見つかりませんでした。」というメッセージに埋もれてしまっています。

以下のようにcatchで何を検知したのか教えてください。

C#

1} 2catch( Exception ex ) 3{ 4  Console.WriteLine( "\nMessage ---\n{0}", ex.Message ); 5  Console.WriteLine( "\nHelpLink ---\n{0}", ex.HelpLink ); 6  Console.WriteLine( "\nSource ---\n{0}", ex.Source ); 7 Console.WriteLine( "\nStackTrace ---\n{0}", ex.StackTrace ); 8  Console.WriteLine( "\nTargetSite ---\n{0}", ex.TargetSite ); 9}

例外処理について、
例外処理の無いプログラムは、

Result1 = 処理1 Result1 のエラー判定 Result2 = 処理2 Result2 のエラー判定(2-1) Result2 のエラー判定(2-2) Result2 のエラー判定(2-3) Result3 = 処理3 Result3 のエラー判定

というように書きますが、あとからソースコードが見辛くなるため、
例外処理(try〜catch〜)が生まれました。

try〜catch〜を使うと

try{ 処理1 処理2  処理3 } catch (例外情報) { 例外情報の表示 }

と記述が本来の処理と例外処理が分離できて見やすくなります。
ただし、しっかりコントロールして記述しないと処理1、処理2、処理3のどこで例外が発生したのか
デバッグで分かりづらくなるため、最近では例外処理をなんでもかんでもひと括りにするのは
止めようというおっしゃる方もいます。

投稿2019/06/01 06:03

kurokoSin

総合スコア133

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

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

BURI55

2019/06/01 06:17

Message --- オブジェクト参照がオブジェクト インスタンスに設定されていません。 HelpLink --- Source --- test StackTrace --- 場所 test.Program.Main(String[] args) 場所 C:\Users\user\source\repos\test\test\Program.cs:行 32 TargetSite --- Void Main(System.String[]) でした。
kurokoSin

2019/06/01 06:33

```var tracks = iTunes.LibraryPlaylist.Search(comment, ITPlaylistSearchField.ITPlaylistSearchFieldSongNames);``` の行で落ちてますね。 エラーメッセージを見る限り、commentか、ITPlay〜 どちらかがNullに見えます。 libraryPlaylist から、ITPlaylistSearchField.ITPlaylistSearchFieldSongNames を取得する必要があるのでは無いでしょうか?(詳しくわかりませんが。)
BURI55

2019/06/01 06:41

libraryPlaylist から、ITPlaylistSearchField.ITPlaylistSearchFieldSongNames を取得する必要があるので、それを取得して表示するプログラムなので、iTunesにない曲を問い合わせてしまったときに、おそらくiTunesに問い合わせた結果がnullが帰ってきてしまうので例外が出るのだと思いました。例外はiTunesにない曲などを入れてしまったときに発生します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問