DecoderExceptionFallback Klasa

Definicja

Zapewnia mechanizm obsługi błędów nazywany rezerwą dla zakodowanej sekwencji bajtów wejściowych, której nie można przekonwertować na znak wejściowy. Rezerwowy element zgłasza wyjątek zamiast dekodowania sekwencji bajtów wejściowych. Klasa ta nie może być dziedziczona.

C#
public sealed class DecoderExceptionFallback : System.Text.DecoderFallback
C#
[System.Serializable]
public sealed class DecoderExceptionFallback : System.Text.DecoderFallback
Dziedziczenie
DecoderExceptionFallback
Atrybuty

Przykłady

W poniższym przykładzie kodu pokazano DecoderExceptionFallback klasy i DecoderFallbackException .

C#
// This example demonstrates the DecoderExceptionFallback class.

using System;
using System.Text;

class Sample
{
    public static void Main()
    {

// Create an encoding, which is equivalent to calling the
// ASCIIEncoding class constructor.
// The DecoderExceptionFallback parameter specifies that an exception
// is thrown if a character cannot be encoded.
// An encoder exception fallback is also specified, but in this code
// example the encoding operation cannot fail.

    Encoding ae = Encoding.GetEncoding(
                  "us-ascii",
                  new EncoderExceptionFallback(),
                  new DecoderExceptionFallback());
    string inputString = "XYZ";
    string decodedString;
    string twoNewLines = "\n\n";
    byte[] encodedBytes = new byte[ae.GetByteCount(inputString)];
    int numberOfEncodedBytes = 0;

// --------------------------------------------------------------------------
    Console.Clear();

// Display the name of the encoding.
    Console.WriteLine("The name of the encoding is \"{0}\".\n", ae.WebName);

// Display the input string in text.
    Console.WriteLine("Input string ({0} characters): \"{1}\"",
                       inputString.Length, inputString);

// Display the input string in hexadecimal.
    Console.Write("Input string in hexadecimal: ");
    foreach (char c in inputString.ToCharArray())
        {
        Console.Write("0x{0:X2} ", (int)c);
        }
    Console.Write(twoNewLines);

// --------------------------------------------------------------------------
// Encode the input string.

    Console.WriteLine("Encode the input string...");
    numberOfEncodedBytes = ae.GetBytes(inputString, 0, inputString.Length,
                                       encodedBytes, 0);
// Display the encoded bytes.
    Console.WriteLine("Encoded bytes in hexadecimal ({0} bytes):\n",
                       numberOfEncodedBytes);
    foreach (byte b in encodedBytes)
        {
        Console.Write("0x{0:X2} ", (int)b);
        }
    Console.Write(twoNewLines);

// --------------------------------------------------------------------------

// Replace the encoded byte sequences for the characters 'X' and 'Z' with the
// value 0xFF, which is outside the valid range of 0x00 to 0x7F for
// ASCIIEncoding. The resulting byte sequence is actually the beginning of
// this code example because it is the input to the decoder operation, and
// is equivalent to a corrupted or improperly encoded byte sequence.

    encodedBytes[0] = 0xFF;
    encodedBytes[2] = 0xFF;

    Console.WriteLine("Display the corrupted byte sequence...");
    Console.WriteLine("Encoded bytes in hexadecimal ({0} bytes):\n",
                       numberOfEncodedBytes);
    foreach (byte b in encodedBytes)
        {
        Console.Write("0x{0:X2} ", (int)b);
        }
    Console.Write(twoNewLines);

// --------------------------------------------------------------------------
// Attempt to decode the encoded bytes. However, an exception is thrown
// before the byte sequence can be decoded.

    Console.WriteLine("Compare the decoded bytes to the input string...");

    try {
        decodedString = ae.GetString(encodedBytes);
        }
    catch (DecoderFallbackException dfe)
        {
        Console.WriteLine(dfe);
        Console.WriteLine("\n*** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. ***");
        return;
        }

// This statement is never executed.
    Console.WriteLine("This statement is never executed.");
    }
}
/*
This code example produces the following results:

The name of the encoding is "us-ascii".

Input string (3 characters): "XYZ"
Input string in hexadecimal: 0x58 0x59 0x5A

Encode the input string...
Encoded bytes in hexadecimal (3 bytes):

0x58 0x59 0x5A

Display the corrupted byte sequence...
Encoded bytes in hexadecimal (3 bytes):

0xFF 0x59 0xFF

Compare the decoded bytes to the input string...
System.Text.DecoderFallbackException: Unable to translate bytes [FF] at index 0 from speci
fied code page to Unicode.
   at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index)
   at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index
)
   at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes)
   at System.Text.ASCIIEncoding.GetCharCount(Byte* bytes, Int32 count, DecoderNLS decoder)

   at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encod
ing)
   at System.Text.ASCIIEncoding.GetString(Byte[] bytes, Int32 byteIndex, Int32 byteCount)
   at System.Text.Encoding.GetString(Byte[] bytes)
   at Sample.Main()

*** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. ***

*/

Uwagi

Kodowanie mapuje znak Unicode na zakodowaną sekwencję bajtów, którą można następnie przenieść na nośnik fizyczny, taki jak dysk lub za pośrednictwem łącza komunikacyjnego. Znaki mogą być mapowane na różne sposoby, a określone kodowanie jest reprezentowane przez typ pochodzący z Encoding klasy. W szczególności metoda kodowania GetBytes koduje znak do sekwencji bajtów, a GetChars metoda dekoduje sekwencję bajtów na znak.

Operacja dekodowania może zakończyć się niepowodzeniem, jeśli nie można zamapować sekwencji bajtów wejściowych przez kodowanie. Na przykład ASCIIEncoding obiekt nie może zdekodować sekwencji bajtów, która zwraca znak o wartości punktu kodu spoza zakresu U+0000 do U+007F.

W przypadkach, gdy nie można wykonać konwersji kodowania lub dekodowania, .NET Framework zapewnia mechanizm obsługi błędów nazywany rezerwą. Aplikacja może używać wstępnie zdefiniowanego rezerwowego dekodera .NET Framework lub utworzyć niestandardowy rezerwowy dekoder pochodzący z DecoderFallback klas i DecoderFallbackBuffer .

.NET Framework zawiera dwie wstępnie zdefiniowane klasy, które implementują różne strategie rezerwowe do obsługi błędów konwersji dekodowania. Klasa DecoderReplacementFallback zastępuje ciąg podany zamiast jakiejkolwiek sekwencji bajtów wejściowych, której nie można przekonwertować. Po emitowaniu ciągu zastępczego operacja dekodowania kontynuuje konwertowanie pozostałej części danych wejściowych. DecoderExceptionFallback Natomiast klasa zgłasza błądDecoderFallbackException, gdy napotkana jest nieprawidłowa sekwencja bajtów.

Konstruktory

DecoderExceptionFallback()

Inicjuje nowe wystąpienie klasy DecoderExceptionFallback.

Właściwości

MaxCharCount

Pobiera maksymalną liczbę znaków, które może zwrócić to wystąpienie.

Metody

CreateFallbackBuffer()

Zwraca bufor rezerwowy dekodera, który zgłasza wyjątek, jeśli nie może przekonwertować sekwencji bajtów na znak.

Equals(Object)

Wskazuje, czy bieżący DecoderExceptionFallback obiekt i określony obiekt są równe.

GetHashCode()

Pobiera kod skrótu dla tego wystąpienia.

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy

Produkt Wersje
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Zobacz też