共用方式為


Console.Error 屬性

定義

會得到標準誤差輸出流。

public:
 static property System::IO::TextWriter ^ Error { System::IO::TextWriter ^ get(); };
public static System.IO.TextWriter Error { get; }
static member Error : System.IO.TextWriter
Public Shared ReadOnly Property Error As TextWriter

屬性值

A TextWriter 代表標準誤差的輸出串流。

範例

以下範例是一個名為 ExpandTabs 的命令列工具,它用四個空格替換文字檔中的 tab 字元,空格由 tabSize 變數定義。 它會將標準輸入與輸出串流重新導向到檔案,但使用 Error 該特性將標準錯誤串流寫入主控台。 可從命令列啟動,輸入包含 tab 字元的檔案名稱及輸出檔案名稱即可。

using System;
using System.IO;

public class ExpandTabs
{
    private const int tabSize = 4;
    private const string usageText = "Usage: EXPANDTABSEX inputfile.txt outputfile.txt";

    public static void Main(string[] args)
    {
        StreamWriter writer = null;

        if (args.Length < 2) {
            Console.WriteLine(usageText);
            return;
        }

        try {
            writer = new StreamWriter(args[1]);
            Console.SetOut(writer);
            Console.SetIn(new StreamReader(args[0]));
        }
        catch(IOException e) {
            TextWriter errorWriter = Console.Error;
            errorWriter.WriteLine(e.Message);
            errorWriter.WriteLine(usageText);
            return;
        }
        int i;
        while ((i = Console.Read()) != -1) {
            char c = (char)i;
            if (c == '\t')
                Console.Write(("").PadRight(tabSize, ' '));
            else
                Console.Write(c);
        }
        writer.Close();
        // Recover the standard output stream so that a
        // completion message can be displayed.
        StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput());
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
        Console.WriteLine("EXPANDTABSEX has completed the processing of {0}.", args[0]);
        return;
    }
}
open System
open System.IO

let tabSize = 4
let usageText = "Usage: EXPANDTABSEX inputfile.txt outputfile.txt"

[<EntryPoint>]
let main args =
    if args.Length < 2 then
        printfn $"{usageText}"
    else 
        try
            use writer = new StreamWriter(args[1])
            Console.SetOut writer
            Console.SetIn(new StreamReader(args[0]))
            let mutable i = Console.Read()
            while i <> -1 do
                let c = char i
                if c = '\t' then
                    Console.WriteLine(("").PadRight(tabSize, ' '))
                else
                    printf $"{c}"
                i <- Console.Read()
            // Recover the standard output stream so that a
            // completion message can be displayed.
            use standardOutput = new StreamWriter(Console.OpenStandardOutput())
            standardOutput.AutoFlush <- true
            Console.SetOut standardOutput
            printfn $"EXPANDTABSEX has completed the processing of {args[0]}."
        with :? IOException as e ->
            let errorWriter = Console.Error
            errorWriter.WriteLine e.Message
            errorWriter.WriteLine usageText
    0
Imports System.IO

Public Class ExpandTabs
   Private Const tabSize As Integer = 4
   Private Const usageText As String = "Usage: EXPANDTABSEX inputfile.txt outputfile.txt"
   
   Public Shared Sub Main(args() As String)
      Dim writer As StreamWriter = Nothing

      If args.Length < 2 Then
         Console.WriteLine(usageText)
         Exit Sub
      End If
      
      Try
         writer = New StreamWriter(args(1))
         Console.SetOut(writer)
         Console.SetIn(New StreamReader(args(0)))
      Catch e As IOException
         Console.Error.WriteLine(e.Message)
         Console.Error.WriteLine(usageText)
         Exit Sub
      End Try
      
      Dim i As Integer = Console.Read()
      While i <> -1 
         Dim c As Char = Convert.ToChar(i)
         If c = ControlChars.Tab Then
            Console.Write("".PadRight(tabSize, " "c))
         Else
            Console.Write(c)
         End If
         i = Console.Read()
      End While
      writer.Close()
      
      ' Reacquire the standard output stream so that a
      ' completion message can be displayed.
      Dim standardOutput As New StreamWriter(Console.OpenStandardOutput)
      standardOutput.AutoFlush = True
      Console.SetOut(standardOutput)
      Console.WriteLine("EXPANDTABSEX has completed the processing of {0}.", args(0))
   End Sub
End Class

以下範例是一個簡單的文字檔案檢視器,可將一個或多個文字檔案的內容顯示給主控台。 若沒有命令列參數,或沒有任何以命令列參數傳遞的檔案存在,範例會呼叫 SetError 將錯誤資訊重新導向到檔案的方法,呼叫該方法在重新取得標準錯誤串流的過程中, OpenStandardError 並表示錯誤資訊已寫入檔案。

using System;
using System.IO;

public class ViewTextFile
{
   public static void Main()
   {
      String[] args = Environment.GetCommandLineArgs();
      String errorOutput = "";
      // Make sure that there is at least one command line argument.
      if (args.Length <= 1)
         errorOutput += "You must include a filename on the command line.\n";

      for (int ctr = 1; ctr <= args.GetUpperBound(0); ctr++)  {
         // Check whether the file exists.
         if (!File.Exists(args[ctr])) {
            errorOutput += String.Format("'{0}' does not exist.\n", args[ctr]);
         }
         else {
            // Display the contents of the file.
            StreamReader sr = new StreamReader(args[ctr]);
            String contents = sr.ReadToEnd();
            sr.Close();
            Console.WriteLine("*****Contents of file '{0}':\n\n",
                              args[ctr]);
            Console.WriteLine(contents);
            Console.WriteLine("*****\n");
         }
      }

      // Check for error conditions.
      if (!String.IsNullOrEmpty(errorOutput)) {
         // Write error information to a file.
         Console.SetError(new StreamWriter(@".\ViewTextFile.Err.txt"));
         Console.Error.WriteLine(errorOutput);
         Console.Error.Close();
         // Reacquire the standard error stream.
         var standardError = new StreamWriter(Console.OpenStandardError());
         standardError.AutoFlush = true;
         Console.SetError(standardError);
         Console.Error.WriteLine("\nError information written to ViewTextFile.Err.txt");
      }
   }
}
// If the example is compiled and run with the following command line:
//     ViewTextFile file1.txt file2.txt
// and neither file1.txt nor file2.txt exist, it displays the
// following output:
//     Error information written to ViewTextFile.Err.txt
// and writes the following text to ViewTextFile.Err.txt:
//     'file1.txt' does not exist.
//     'file2.txt' does not exist.
open System
open System.IO

let args = Environment.GetCommandLineArgs()[1..]
let mutable errorOutput = ""
// Make sure that there is at least one command line argument.
if args.Length < 1 then
    errorOutput <- errorOutput + "You must include a filename on the command line.\n"

for file in args do
    // Check whether the file exists.
    if File.Exists file then
        errorOutput <- errorOutput + $"'{file}' does not exist.\n"
    else
        // Display the contents of the file.
        use sr = new StreamReader(file)
        let contents = sr.ReadToEnd()
        Console.WriteLine $"*****Contents of file '{file}':\n\n"
        Console.WriteLine contents
        Console.WriteLine "*****\n"

// Check for error conditions.
if not (String.IsNullOrEmpty errorOutput) then
    // Write error information to a file.
    Console.SetError(new StreamWriter(@".\ViewTextFile.Err.txt"))
    Console.Error.WriteLine errorOutput
    Console.Error.Close()
    // Reacquire the standard error stream.
    use standardError = new StreamWriter(Console.OpenStandardError())
    standardError.AutoFlush <- true
    Console.SetError standardError
    Console.Error.WriteLine "\nError information written to ViewTextFile.Err.txt"

// If the example is compiled and run with the following command line:
//     ViewTextFile file1.txt file2.txt
// and neither file1.txt nor file2.txt exist, it displays the
// following output:
//     Error information written to ViewTextFile.Err.txt
// and writes the following text to ViewTextFile.Err.txt:
//     'file1.txt' does not exist.
//     'file2.txt' does not exist.
Imports System.IO

Module ViewTextFile
   Public Sub Main()
      Dim args() As String = Environment.GetCommandLineArgs()
      Dim errorOutput As String = ""
      ' Make sure that there is at least one command line argument.
      If args.Length <= 1 Then
         errorOutput += "You must include a filename on the command line." +
                        vbCrLf
      End If
      
      For ctr As Integer = 1 To args.GetUpperBound(0)
         ' Check whether the file exists.
         If Not File.Exists(args(ctr)) Then
            errorOutput += String.Format("'{0}' does not exist.{1}",
                                         args(ctr), vbCrLf)
         Else
            ' Display the contents of the file.
            Dim sr As New StreamReader(args(ctr))
            Dim contents As String = sr.ReadToEnd()
            sr.Close()
            Console.WriteLine("***** Contents of file '{0}':{1}{1}",
                              args(ctr), vbCrLf)
            Console.WriteLine(contents)
            Console.WriteLine("*****{0}", vbCrLf)
         End If
      Next

      ' Check for error conditions.
      If Not String.IsNullOrEmpty(errorOutput) Then
         ' Write error information to a file.
         Console.SetError(New StreamWriter(".\ViewTextFile.Err.txt"))
         Console.Error.WriteLine(errorOutput)
         Console.Error.Close()
         ' Reacquire the standard error stream.
         Dim standardError As New StreamWriter(Console.OpenStandardError())
         standardError.AutoFlush = True
         Console.SetError(standardError)
         Console.Error.WriteLine("{0}Error information written to ViewTextFile.Err.txt",
                                 vbCrLf)
      End If
   End Sub
End Module
' If the example is compiled and run with the following command line:
'     ViewTextFile file1.txt file2.txt
' and neither file1.txt nor file2.txt exist, it displays the
' following output:
'     Error information written to ViewTextFile.Err.txt
' and writes the following text to ViewTextFile.Err.txt:
'     'file1.txt' does not exist.
'     'file2.txt' does not exist.

請注意,該StreamWriter.AutoFlush屬性在重新取得錯誤串流之前已設定為 。true 這確保輸出會立即傳送到主控台,而非緩衝區。

備註

這個標準錯誤串流預設設在主控台。 可以用這個 SetError 方法設定到另一個串流。 標準誤差串流被重新導向後,可以透過呼叫 OpenStandardError 該方法重新取得。

在資訊輸出常被導向到檔案的主控台應用程式中,透過該 Error 屬性提供的標準錯誤流仍可用來向主控台顯示資訊,即使輸出被重定向。 以下範例顯示每次 10 個數字的乘積表,從 1 開始。 每完成一組 10 個數字後,會用這個 Error 屬性詢問使用者是否要顯示下一組數字。 如果標準輸出被導向到檔案,使用者仍會被詢問例程是否應該產生下一組產品。

using System;

public class Example
{
   public static void Main()
   {
      int increment = 0;
      bool exitFlag = false;

      while (!exitFlag) {
         if (Console.IsOutputRedirected)
            Console.Error.WriteLine("Generating multiples of numbers from {0} to {1}",
                                    increment + 1, increment + 10);

         Console.WriteLine("Generating multiples of numbers from {0} to {1}",
                           increment + 1, increment + 10);
         for (int ctr = increment + 1; ctr <= increment + 10; ctr++) {
            Console.Write("Multiples of {0}: ", ctr);
            for (int ctr2 = 1; ctr2 <= 10; ctr2++)
               Console.Write("{0}{1}", ctr * ctr2, ctr2 == 10 ? "" : ", ");

            Console.WriteLine();
         }
         Console.WriteLine();

         increment += 10;
         Console.Error.Write("Display multiples of {0} through {1} (y/n)? ",
                             increment + 1, increment + 10);
         Char response = Console.ReadKey(true).KeyChar;
         Console.Error.WriteLine(response);
         if (!Console.IsOutputRedirected)
            Console.CursorTop--;

         if (Char.ToUpperInvariant(response) == 'N')
            exitFlag = true;
      }
   }
}
open System

let mutable increment = 0
let mutable exitFlag = false

while not exitFlag do
    if Console.IsOutputRedirected then
        Console.Error.WriteLine $"Generating multiples of numbers from {increment + 1} to {increment + 10}"

    Console.WriteLine $"Generating multiples of numbers from {increment + 1} to {increment + 10}"

    for i = increment + 1 to increment + 10 do
        Console.Write $"Multiples of {i}: "
        for j = 1 to 10 do
            Console.Write $"""{i * j}{if j = 10 then "" else ", "}"""

        Console.WriteLine()
    Console.WriteLine()

    increment <- increment + 10
    Console.Error.Write $"Display multiples of {increment + 1} through {increment + 10} (y/n)? "
    let response = Console.ReadKey(true).KeyChar
    Console.Error.WriteLine response
    if not Console.IsOutputRedirected then
        Console.CursorTop <- Console.CursorTop - 1 

    if Char.ToUpperInvariant response = 'N' then
        exitFlag <- true
Module Example
   Public Sub Main()
      Dim increment As Integer = 0
      Dim exitFlag As Boolean = False
      
      Do While Not exitFlag
         If Console.IsOutputRedirected Then
            Console.Error.WriteLine("Generating multiples of numbers from {0} to {1}",
                                    increment + 1, increment + 10)
         End If
         Console.WriteLine("Generating multiples of numbers from {0} to {1}",
                           increment + 1, increment + 10)
         For ctr As Integer = increment + 1 To increment + 10
            Console.Write("Multiples of {0}: ", ctr)
            For ctr2 As Integer = 1 To 10
               Console.Write("{0}{1}", ctr * ctr2, If(ctr2 = 10, "", ", "))
            Next
            Console.WriteLine()
         Next
         Console.WriteLine()
         
         increment += 10
         Console.Error.Write("Display multiples of {0} through {1} (y/n)? ",
                             increment + 1, increment + 10)
         Dim response As Char = Console.ReadKey(True).KeyChar
         Console.Error.WriteLine(response)
         If Not Console.IsOutputRedirected Then
            Console.CursorTop = Console.CursorTop - 1
         End If
         If Char.ToUpperInvariant(response) = "N" Then exitFlag = True
      Loop
   End Sub
End Module

適用於

另請參閱