C#で子プロセスの例外を監視し、親プロセスで処理する方法

目次

前置き

 C#では、Process.Start()メソッドを使用することで、外部のEXEを実行することができます。これは、異なるプログラムを組み合わせる際に非常に便利な機能です。

 しかし、このような場合、子プロセスで発生した例外を親プロセスでハンドリングする方法が必要になります。このブログ記事では、C#で子プロセスの例外を監視し、親プロセスで処理する方法を紹介します。

 親プロセスから子プロセスのステータスを監視し、例外が発生した場合には、それをハンドリングし、必要に応じて処理を行う方法を説明します。これにより、子プロセスで発生した例外をスムーズに処理することができるようになります。

Process.Start()の使い方

 Process.Start()メソッドは、外部のEXEを実行するためのメソッドです。使用方法は非常に簡単で、次のようになります。

Process process = new Process();
process.StartInfo.FileName = "example.exe"; //実行するEXEのパス
process.Start();

 上記のように、Processクラスのインスタンスを作成し、StartInfo.FileNameに実行するEXEのパスを指定し、Start()メソッドを呼び出すだけです。

 もし、引数を渡したい場合は、StartInfo.Argumentsに渡したい引数を指定します。

Process process = new Process();
process.StartInfo.FileName = "example.exe"; //実行するEXEのパス
process.StartInfo.Arguments = "arg1 arg2 arg3"; 
process.Start();

 このように、Process.Start()メソッドを使用することで、外部のEXEを実行することができます。これにより、異なるプログラムを組み合わせることができるようになります。

子プロセスでの例外ハンドリング

 子プロセスで発生した例外を親プロセスで取得するには、子プロセスで例外が発生した際に、終了コードを設定することが必要です。

 子プロセス内で例外が発生した際に、終了コードを設定するために、try-catch文を使用します。

try
{
    // 例外が発生する可能性のある処理
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
    Environment.ExitCode = -1;
}

 上記のように、try-catch文を使用し、例外が発生した際に、終了コードを設定します。 ここで、終了コードには任意の整数値を設定することができますが、0以外の値を設定することで、親プロセス側で例外が発生したことを確認することができます。

親プロセスでの例外の監視と処理

 子プロセスで発生した例外を親プロセスで取得するためには、親プロセスで子プロセスの終了状態を監視する必要があります。

 そのために、ProcessクラスのWaitForExit()メソッドを使用します。

Process process = new Process();
process.Start();
process.WaitForExit();

 上記のように、Process.Start()メソッドで子プロセスを起動し、Process.WaitForExit()メソッドで子プロセスの終了を待機します。

 次に、子プロセスが正常に終了したか、例外が発生したかを判定するために、Process.ExitCodeプロパティを使用します。

if(process.ExitCode != 0)
{
    Console.WriteLine("子プロセスで例外が発生しました。");
}
else
{
    Console.WriteLine("子プロセスは正常に終了しました。");
}

 上記のように、Process.ExitCodeプロパティを使用して、子プロセスの終了コードを取得し、0以外の値が返ってきた場合は、例外が発生したと判断し、処理を行うことができます。

完全なサンプルコード

親プロセス

 ここでは、C#で子プロセスの例外を監視し、親プロセスで処理する方法のコード例を示します。

using System;
using System.Diagnostics;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // 子プロセスの起動
        var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "子プロセスのパス",
                UseShellExecute = false,
                RedirectStandardError = true,
                CreateNoWindow = true
            }
        };
        process.Start();

        // 子プロセスの終了を待つ
        process.WaitForExit();

        // 子プロセスの終了コードを取得
        int exitCode = process.ExitCode;

        // 終了コードが0でない場合は、例外が発生したことを意味する
        if (exitCode != 0)
        {
            string error = process.StandardError.ReadToEnd();
            Console.WriteLine($"子プロセスで例外が発生しました。終了コード:{exitCode}, エラー:{error}");
        }
        else
        {
            Console.WriteLine("子プロセスは正常に終了しました。");
        }
    }
}

 上記のコードは、子プロセスを起動し、終了を待ちます。その後、終了コードを取得し、0でなければ、例外が発生したことを意味し、エラーを表示します。

子プロセス

using System;
using System.Diagnostics;

class ChildProcess
{
    static void Main(string[] args)
    {
        try
        {
            // 子プロセスで実行する処理
            // 例:配列の要素数が負の数の場合に例外を発生
            int[] array = new int[-1];
        }
        catch (Exception e)
        {
            // 例外が発生した場合、終了コードを1に設定
            Environment.ExitCode = 1;
            Console.WriteLine("Error: " + e.Message);
        }
    }
}

 このように、子プロセス側で例外が発生した場合に、Environment.ExitCodeにエラーコードを設定し、プログラムを終了させることができます。

結論

 C#で子プロセスを起動する際に、子プロセスで発生した例外を親プロセスで受け取る方法を説明しました。

  • Process.Start()を使用し、子プロセスで発生した例外をハンドリングし、終了コードを設定しました。
  • 親プロセスでは、子プロセスの終了コードをチェックし、エラーが発生した場合は適切な処理を行うことができます。
  • このようにして、C#を使用したマルチプロセスのプログラミングにおいて、子プロセスのエラー管理を行うことができます。

 詳細は、公式ドキュメントを参照してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

■管理者について:
 物事のしくみや構造理解に強みを持っているフリーランスのシステムエンジニアです。日々の小さな気づきや仕事のTipsをブログで共有していきます。

■お仕事依頼:
 システム開発は直接請負のみ承ります。
 自社のシステム開発が未経験の企業様向けのサポートも行っています。

■免責事項:
 このブログ上で紹介される情報は私個人の見解に基づくものであり、多くの実験的な試行を含む為、必ずしも正確であるとは限りません。あくまで自己責任において、ご自身の手で確認してください。

目次