1. はじめに
本記事では、C#で同期実行したプロセスで発生したWindows APIの失敗を、Win32Exceptionクラスを用いて取得し出力する方法についてご紹介します。
2. 基本知識
2.1 システムエラーコード
Windows OSによって定義されたエラー状態を表す整数値です。
これらのエラーコードは、アプリケーションやシステムコンポーネントがエラーを返す際に使用され、開発者やサポート担当者が問題を特定するための手掛かりとなります。
2.2 Win32Exception
NET Frameworkが提供するクラスで、Windows APIの呼び出しで発生したエラーから、そのエラーコードに対応するメッセージを提供する例外クラスです。
Windowsのシステムエラーコードに対応しており、Windows APIが定義しているエラーコードを基に、そのエラーコードに関連付けられたエラーメッセージをシステムから取得して表示します。
エラーメッセージの言語はローカルのシステム設定や言語設定によって自動適用されます。
3. 実装
以下のコードは、cmd.exe /c invalid_command
(不正な引数コマンド) を実行して、発生したエラーを取得してエラーメッセージを表示します。
3.1 ソースコード
using System;
using System.Diagnostics;
using System.ComponentModel;
namespace Win32ErrorCodeExample
{
class Program
{
static void Main(string[] args)
{
// 不正なコマンドを実行して故意にエラーを発生させる
var info = new ProcessStartInfo("cmd.exe", "/c invalid_command")
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using (var process = Process.Start(info))
{
// 同期的にプロセスを終了するまで待機
process.WaitForExit();
// プロセスの終了コードを取得
int exitCode = process.ExitCode;
// エラーが発生している場合はエラーメッセージを取得して表示
if (exitCode != 0)
{
string errorMessage = GetWin32ErrorMessage(exitCode);
Console.WriteLine($"エラーが発生しました: {errorMessage} (コード: {exitCode})");
}
else
{
Console.WriteLine("プロセスが正常に終了しました。");
}
}
}
// Win32エラーメッセージを取得するメソッド
static string GetWin32ErrorMessage(int errorCode)
{
return new Win32Exception(errorCode).Message;
}
}
}
3.2 実行結果
エラーが発生しました: ファンクションが間違っています。 (コード: 1)
4. 解説
4.1 プロセスの実行
ProcessStartInfoを使用して、外部コマンドの設定を行っています。
- CreateNoWindow:実行時にウィンドウを表示せずに実行
- UseShellExecute:シェルを使用してプロセスを開始
- RedirectStandardOutput・RedirectStandardError: 標準出力および標準エラーを取得可能に設定
Process.Start(info)
で設定されたプロセスを開始し、WaitForExit
で終了を待機します。
その後、プロセスの終了コードをExitCode
プロパティから取得します。
4.2 Win32Exceptionを使用してエラーメッセージを取得
Win32Exception(errorCode).Message
Win32ExceptionクラスのMessage
プロパティを使用して、システムエラーコードに紐付けられたメッセージを取得します。
今回のソースコードでは以下の内容を取得しています。
- エラーコード:1
- エラーメッセージ:
ファンクションが間違っています。
5. おわりに
エラーコードだけでなくエラーメッセージも出力することで、理解しやすいエラー通知が実装できました。
実行ログの出力時などに活用することで、エラーコードをテキスト形式で簡単に扱えるため、開発者が読みやすいログ生成が可能です。
6. 参考