2011-09-26 8 views
20

Przeglądam jakiś kod i znalazłem e.ToString() i zastanawiałem się, czy istnieje różnica w korzystaniu z metody ToString() zamiast .Message?Czym różni się wyjątek od .ToString() i .Message?

Czytanie poniżej brzmi, jakby zwracało więcej informacji.

From Microsoft's Docs

ToString Obsługiwane przez .NET Compact Framework. Zastąpiono. Tworzy i zwraca ciąg znaków reprezentujący bieżący wyjątek.

Wiadomość Obsługiwana przez .NET Compact Framework. Pobiera komunikat opisujący bieżący wyjątek.

+7

myślę, że odpowiedział na własne pytanie –

+0

Wyjątek jest obiekt, za pomocą ToString na nim, konwertuje obiekt na ciąg (który jest obiektem), więc prawdopodobnie byłby równy wyjątkowi Namespace.Exception. –

+3

@Ramhound: 'Overception wyjątków' ToString'. – SLaks

Odpowiedz

18

Jeśli szukasz, aby uzyskać jak najwięcej informacji, za jednym zamachem, zadzwoń ToString():

Domyślna implementacja ToString uzyskuje nazwę klasy, która rzuciła bieżący wyjątek, się komunikat(mój nacisk), wynik wywołania ToString na wewnętrzny wyjątek i wynik wywołania Environment.StackTrace. Jeśli którykolwiek z tych elementów jest Nothing, jego wartość nie jest zawarta w zwracanym łańcuchu.

Jest to wygodne, że nie trzeba dołączyć wszystkie poszczególne elementy razem siebie, sprawdzając, aby upewnić się nikt nie jest null, itd. To wszystko jest zbudowany w ...

Exception.ToString Method

Ty można również sprawdzić rzeczywisty kod źródłowy pod numerem reference.microsoft.com.

0

Metoda ToString zwraca właściwość Message wraz z informacją, gdzie wystąpił błąd.

Właściwość Message służy do krótkiego opisu błędu i zawiera tylko to, co osoba wprowadzająca wyjątek tam umieściła. Resport z ToString zawiera dodatkowe informacje, które są zawsze uwzględniane.

Jeśli używasz trybu debugowania, raport o błędzie zawiera bardziej szczegółowe informacje, np. numery linii w stosie wywołań.

5

ToString() zwraca Message wraz z StackTrace.
ToString() będzie również rekursywnie obejmować InnerException s.

ToString() zwraca znacznie dłuższy ciąg, który jest znacznie bardziej przydatny niż Message podczas śledzenia błędów.

2

Zawsze możesz po prostu spróbować i zobaczyć:

try 
{ 
    throw new Exception("This is a test."); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex); 
    Console.WriteLine(ex.Message); 
} 

(Przekonasz się, że masz rację, .ToString jest bardziej pouczający, w tym między innymi do śledzenia stosu

+4

Powinieneś użyć tego bloku catch: 'catch (Exception ex) { Console.WriteLine (" #### RESULT OF CONSTRUCTION ###### "); Console.WriteLine (ex); Console.WriteLine(); Console.WriteLine ("#### WYNIK KOMUNIKATU ######") ;; Console.WriteLine (ex.Message); } '. Pomoże to OP odróżnić wyniki obu –

0

Wiadomość e..ToString() da ci szczegółową wiadomość, taką jak PrintTrace, i myślę, że Display jest nazwą wyjątku i linią, gdzie wyrzucano wyjątek, gdzie e.Message Output jest czytelną wiadomością tylko bez specyfikacji.

Można sprawdzić konstruktora bazowy Wyjątek

12

Spróbuj użyć .NET odbijające lub podobne, aby zobaczyć co metoda toString na System.Exception robi:

[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")] 
public override string ToString() 
{ 
    return this.ToString(true); 
} 

private string ToString(bool needFileLineInfo) 
{ 
    string className; 
    string message = this.Message; 
    if ((message == null) || (message.Length <= 0)) 
    { 
     className = this.GetClassName(); 
    } 
    else 
    { 
     className = this.GetClassName() + ": " + message; 
    } 
    if (this._innerException != null) 
    { 
     className = className + " ---> " + this._innerException.ToString(needFileLineInfo) + Environment.NewLine + " " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack"); 
    } 
    string stackTrace = this.GetStackTrace(needFileLineInfo); 
    if (stackTrace != null) 
    { 
     className = className + Environment.NewLine + stackTrace; 
    } 
    return className; 
} 
Powiązane problemy