0

次のテスト プログラムでは、エラー出力が正しく Error.txt に書き込まれます。

using System;
using System.IO;

public class Test{
public static void Main(string[] args){
    Console.SetOut(new StreamWriter("Output.txt", true));
    Console.SetError(new StreamWriter("Error.txt", true));
    int[] test = new int[1];
    Console.Error.WriteLine(test[0]);
}
}

ただし、行を変更すると

    Console.Error.WriteLine(test[0]);

    Console.Error.WriteLine(test[7]);

これにより例外が発生すると、この例外のエラー メッセージがファイルではなくコンソールに出力されます。システムがスローした例外のエラー メッセージもファイルにリダイレクトされるようにプログラムで設定するにはどうすればよいですか?

このプログラムが実行されるコンテキストのため、単純なコンソールのリダイレクト (2> または >) はオプションではありません。

4

3 に答える 3

2

Console.SetError メソッドが実際にアプリケーションの「DOS」エラー出力を変更するとは思いません。Console.Error が出力する場所だけです。PInvoking SetStdHandle を試す必要があります。この例については、こちらを参照してください: C# Windows サービスで stdout+stderr をリダイレクトする

于 2012-07-17T03:17:09.020 に答える
0

エラー出力は、使用しようとしている方法では機能しないと思います。これは、いくつかのエラーに関する情報を出力するための単なる方法です。これを見てください http://msdn.microsoft.com/en-us/library/system.console.seterror.aspx

エラーについて何か書きたい場合は、次のことを行う必要があります。

Console.Error.WriteLine("Error Log for Application {0}", appName);

そのため、例外に関する情報を stderr に書き込みたい場合は、例外をキャッチして、そのメッセージを stderr に送信する必要があります。

...
catch(Exception e) { Console.Error.WriteLine(e.Message); }
于 2012-07-17T03:46:58.273 に答える
0

このようなものをお探しですか?

FileStream errorFileStream = new FileStream("Error.txt", FileMode.OpenOrCreate);
StreamWriter errorStreamWriter = new StreamWriter(errorFileStream);
Console.SetError(errorStreamWriter);

string[] test = new string[2];
test[0] = "Hello";
test[1] = "World";

try
{
    Console.WriteLine(test[2]);
}
catch (Exception ex)
{
    Console.Error.WriteLine(ex.Message);
}

Console.Error.Close();
于 2012-07-17T03:49:46.197 に答える