- PR -

例外ダイアログを表示しない方法

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-06-09 08:43
引用:

一郎さんの書き込み (2004-06-08 23:17) より:

>「デバッグしますか」といった画面が表示されます・・・

その後にメッセージが出てませんか?
exeをダブルクリックで起動した場合は一瞬しか見えないでしょうが。
コマンドプロンプトからexeを実行してみてください。


 こっちのスレッドで報告されている例とあわせると、プロセスAからプロセスBを起動して、プロセスBで例外が発生した場合、「例外が発生した」というメッセージしか表示されないみたいですね。当たり前といえば、当たり前ですが(渋木宏明(ひどり)さんの、『子プロセスの例外を、親プロセスでハンドルすることはできない』)。


 この場合、デバッグの仕方を色々考えないといけないですね。
・プロセスAを単独で起動する
・プロセスBを単独で起動する
・プロセスAからプロセスBを起動する←最終形態

 あっちのスレッドで小野さんがおっしゃっているように、プロセスAまたはプロセスB がノータッチデプロイメントやWebアプリケーションである場合、セキュリティなどで色々と制約がかかってきますね。
 実行させようとしている環境の情報も、必要でしょう。



 それはともかく、スローされた「例外」は「標準エラー」にはでていませんよ。try〜catchで捕まえて、例外の内容を標準エラーにはき出す、という操作をしているなら別ですが。>P子ちゃんさん
得正カレー
会議室デビュー日: 2004/06/08
投稿数: 15
投稿日時: 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(子プロセス)に対して設定する方法をどなたかお教えいただけ
ないでしょうか?

よろしくお願いします〜
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-06-09 13:38
引用:

P子ちゃんさんの書き込み (2004-06-09 12:58) より:


だ〜か〜ら〜、問題の事象だけをとらえるんじゃなくて、問題の根本を探りましょうよぉ〜


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を起動するときに引数を指定していないのでしょうか?
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-06-09 13:49
子プロセスで例外が出ているのなら、そのときのMessageをConsole.Errorにでも書き出せばいいんじゃないですか?
親のほうではProcess.ExitCodeで異常終了したことを確認してからStandardErrorで取り出す、と。

あと、前に書きましたけど、
Dim myStreamReader As StreamReader = myProcess.StandardError
の行に処理が来るということはProcess.Start()に失敗しているわけですからProcess.StandardErrorは取れないんじゃないですか?
得正カレー
会議室デビュー日: 2004/06/08
投稿数: 15
投稿日時: 2004-06-09 14:37
引用:

Jittaさんの書き込み (2004-06-09 13:38) より:
で、問題は、

α.実行形Bで例外が発生していること
β.実行形Aで実行形Bの例外をキャッチできないこと

のどちらでしょう?βはできるの?って気もしますが。αなら、「だったら実行形Bをデバッグしたらええやん」ってことですし、βならSetErrorModeの実行位置や引数の内容が問題かもしれません。あるいは、子タスク起動の方法を変更しなければならないのかもしれません。

 実行形Aを、一生懸命デバッグしているようですが、実行形Bをデバッグできない理由があるのでしょうか?また、実行形Bを起動するときに引数を指定していないのでしょうか?



すみません。。うまく表現できてなくてm(__)m
β.ですね・・・
そもそもの目的はフォルダにアクセスして、「デバイスの準備ができていません」
みたいな出てきたエラーメッセージを取得することです。
ですのでBを起動するときは当然エラーになるような引数を指定してます。

ご助言いただきましたSetErrorModeの実行位置や引数の内容を考調べてみます〜
ありがとうございます(^^)
得正カレー
会議室デビュー日: 2004/06/08
投稿数: 15
投稿日時: 2004-06-09 14:44
引用:

一郎さんの書き込み (2004-06-09 13:49) より:
子プロセスで例外が出ているのなら、そのときのMessageをConsole.Errorにでも書き出せばいいんじゃないですか?
親のほうではProcess.ExitCodeで異常終了したことを確認してからStandardErrorで取り出す、と。


フムフム・・・
なるほどですね〜!やり方がよくわからないですが調べてみますー

引用:

Dim myStreamReader As StreamReader = myProcess.StandardError
の行に処理が来るということはProcess.Start()に失敗しているわけですからProcess.StandardErrorは取れないんじゃないですか?


あ・・・そうですね。気づきませんでした。
皆様のレベルについていってないですが、なんとか頑張って調べてみます!
どうもありがとうございますです!
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-06-09 15:34
引用:

P子ちゃんさんの書き込み (2004-06-09 14:37) より:

そもそもの目的はフォルダにアクセスして、「デバイスの準備ができていません」
みたいな出てきたエラーメッセージを取得することです。
ですのでBを起動するときは当然エラーになるような引数を指定してます。


 あ、そうか、そう書いてありましたね。失礼。
 では、実行形Bで例外が発生するのは当然、と。それでは、その実行形Bは、誰が作ったもので、ソースコードの変更はできますか?
 「実行形」と書いたのは、そのソースコードのにアクセスできるのかどうかがわからなかったからです。


 ここで、私の考えでは、実行形Aと実行形Bというように、EXEファイルを分けるのであれば、実行形Bが例外を生成して落ちるのは、バグです。実行形Bは、その例外をキャッチし、自分のメッセージを出力して、自身は実行を継続する必要がある、と思います。

 あれれ???その前に、実行形BはWindowsアプリケーションですか?それともコマンドアプリケーションですか?
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-06-09 16:34
諸農です。

以下のコードで「デバイスの準備云々」は消えて、
例外処理のところで「デバイスが準備できていません」の
メッセージを出力することが出来ました。

コード:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace UNCPass
{
    class Class
    {
        const uint SEM_FAILCRITICALERRORS = 0x0001;

        [DllImport("KERNEL32.DLL")]
        static extern uint SetErrorMode(uint flg);

        [STAThread]
        static void Main(string[] args)
        {
            uint oldSTS = SetErrorMode(SEM_FAILCRITICALERRORS);
            string path = @"A:\Test";
            Console.WriteLine(path);
            Console.ReadLine();
            Process myPro = new Process();
            ProcessStartInfo pin = new ProcessStartInfo(path);
            pin.UseShellExecute = false;
            pin.RedirectStandardError = true;
            pin.CreateNoWindow = true;
            myPro.StartInfo = pin;
            try
            {
               myPro.Start();
            }catch(Exception e){
               Console.WriteLine(e.Message);
            }finally{
               SetErrorMode(oldSTS);
               Console.WriteLine("END");
               Console.ReadLine();
            }
        }
    }
}




_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

スキルアップ/キャリアアップ(JOB@IT)