- - PR -
例外ダイアログを表示しない方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-06-09 08:43
こっちのスレッドで報告されている例とあわせると、プロセスAからプロセスBを起動して、プロセスBで例外が発生した場合、「例外が発生した」というメッセージしか表示されないみたいですね。当たり前といえば、当たり前ですが(渋木宏明(ひどり)さんの、『子プロセスの例外を、親プロセスでハンドルすることはできない』)。 この場合、デバッグの仕方を色々考えないといけないですね。 ・プロセスAを単独で起動する ・プロセスBを単独で起動する ・プロセスAからプロセスBを起動する←最終形態 あっちのスレッドで小野さんがおっしゃっているように、プロセスAまたはプロセスB がノータッチデプロイメントやWebアプリケーションである場合、セキュリティなどで色々と制約がかかってきますね。 実行させようとしている環境の情報も、必要でしょう。 それはともかく、スローされた「例外」は「標準エラー」にはでていませんよ。try〜catchで捕まえて、例外の内容を標準エラーにはき出す、という操作をしているなら別ですが。>P子ちゃんさん | ||||||||
|
投稿日時: 2004-06-09 12:58
皆様ご回答ありがとうございます・・・
普通にコマンドプロンプトからEXEを起動しているんですけど、 起動すると選択したデバッガを使ってデバッグしますか?」というダイアログが 表示されちゃいます。(ダイアログ中にWin32Exceptionと表示があります) 「いいえ」を押すと次のエラー出力がプロンプトに表示されます。 ------------------------------------------------------------------------- ハンドルされていない例外 : System.ComponentModel.Win32Exception: ファイル名、デ ィレクトリ名、またはボリューム ラベルの構文が間違っています。 at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startIn fo) at System.Diagnostics.Process.Start() at AccessFolderApp1.Module1.Main() in D:\Visual Studio Projects\AccessFolderA pp1\Module1.vb:line 24 ------------------------------------------------------------------------- myProcess.StandardError で子プロセス(myProcess)のエラー内容を 取れるかなぁ〜と思ったんですが、そもそも無理だったんですかねぇ・・・ ちなみに上記の出力内容は、 Console.WriteLine(myStreamReader.ReadLine()) で出てきたものではなかったようです。。(子プロセスの標準エラー出力?) SetErrorMode(SEM_NOOPENFILEERRORBOX) をmyProcess(子プロセス)に対して設定する方法をどなたかお教えいただけ ないでしょうか? よろしくお願いします〜 | ||||||||
|
投稿日時: 2004-06-09 13:38
だ〜か〜ら〜、問題の事象だけをとらえるんじゃなくて、問題の根本を探りましょうよぉ〜 1.実行形Aから実行形BをProcess.Startメソッドで起動する 2.Process.Startメソッドで例外が発生する 3.Process.Startメソッドをtry〜catchで囲っているが、catchには入らない 4.発生している例外はWin32Exceptionである 5.メッセージは「ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています」である ここまではいいですね?無理して文にするより、箇条書きの方が、伝わりやすいし、自分も整理できます。 で、例外が発生しているのは、実行形Aではなく、実行形Bのようです。これもOKですね?で、問題は、 α.実行形Bで例外が発生していること β.実行形Aで実行形Bの例外をキャッチできないこと のどちらでしょう?βはできるの?って気もしますが。αなら、「だったら実行形Bをデバッグしたらええやん」ってことですし、βならSetErrorModeの実行位置や引数の内容が問題かもしれません。あるいは、子タスク起動の方法を変更しなければならないのかもしれません。 実行形Aを、一生懸命デバッグしているようですが、実行形Bをデバッグできない理由があるのでしょうか?また、実行形Bを起動するときに引数を指定していないのでしょうか? | ||||||||
|
投稿日時: 2004-06-09 13:49
子プロセスで例外が出ているのなら、そのときのMessageをConsole.Errorにでも書き出せばいいんじゃないですか?
親のほうではProcess.ExitCodeで異常終了したことを確認してからStandardErrorで取り出す、と。 あと、前に書きましたけど、 Dim myStreamReader As StreamReader = myProcess.StandardError の行に処理が来るということはProcess.Start()に失敗しているわけですからProcess.StandardErrorは取れないんじゃないですか? | ||||||||
|
投稿日時: 2004-06-09 14:37
すみません。。うまく表現できてなくてm(__)m β.ですね・・・ そもそもの目的はフォルダにアクセスして、「デバイスの準備ができていません」 みたいな出てきたエラーメッセージを取得することです。 ですのでBを起動するときは当然エラーになるような引数を指定してます。 ご助言いただきましたSetErrorModeの実行位置や引数の内容を考調べてみます〜 ありがとうございます(^^) | ||||||||
|
投稿日時: 2004-06-09 14:44
フムフム・・・ なるほどですね〜!やり方がよくわからないですが調べてみますー
あ・・・そうですね。気づきませんでした。 皆様のレベルについていってないですが、なんとか頑張って調べてみます! どうもありがとうございますです! | ||||||||
|
投稿日時: 2004-06-09 15:34
あ、そうか、そう書いてありましたね。失礼。 では、実行形Bで例外が発生するのは当然、と。それでは、その実行形Bは、誰が作ったもので、ソースコードの変更はできますか? 「実行形」と書いたのは、そのソースコードのにアクセスできるのかどうかがわからなかったからです。 ここで、私の考えでは、実行形Aと実行形Bというように、EXEファイルを分けるのであれば、実行形Bが例外を生成して落ちるのは、バグです。実行形Bは、その例外をキャッチし、自分のメッセージを出力して、自身は実行を継続する必要がある、と思います。 あれれ???その前に、実行形BはWindowsアプリケーションですか?それともコマンドアプリケーションですか? | ||||||||
|
投稿日時: 2004-06-09 16:34
諸農です。
以下のコードで「デバイスの準備云々」は消えて、 例外処理のところで「デバイスが準備できていません」の メッセージを出力することが出来ました。
_________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ |