C # tương đương với Exception.printStackTrace () của Java?


83

Có phương pháp tương đương C # với Java không Exception.printStackTrace()hay tôi phải tự viết thứ gì đó, làm việc theo cách của tôi thông qua Nội ngoại lệ?

Câu trả lời:


120

Thử đi:

Console.WriteLine(ex.ToString());

Từ http://msdn.microsoft.com/en-us/library/system.exception.tostring.aspx :

Việc triển khai mặc định của ToString nhận được tên của lớp đã ném ngoại lệ hiện tại, thông báo, kết quả của việc gọi ToString trên ngoại lệ bên trong và kết quả của việc gọi Environment.StackTrace. Nếu bất kỳ thành viên nào trong số này là null, giá trị của nó không được bao gồm trong chuỗi trả về.

Lưu ý rằng trong đoạn mã trên, cuộc gọi đến ToStringkhông bắt buộc vì có quá tải phải nhận System.Objectvà gọi ToStringtrực tiếp.


1
Chỉ cần thử nó trong Net Lõi 2.1 trên Linux và có vẻ như nó không phải là sự thật nữa
selalerer

104

Tôi muốn nói thêm: Nếu bạn muốn in ngăn xếp bên ngoài một ngoại lệ, bạn có thể sử dụng:

Console.WriteLine(System.Environment.StackTrace);

10

Như Drew nói, chỉ cần chuyển đổi ngoại lệ một chuỗi sẽ làm được điều này. Ví dụ, chương trình này:

using System;

class Test
{
    static void Main()
    {
        try
        {
            ThrowException();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    static void ThrowException()
    {

        try
        {
            ThrowException2();
        }
        catch (Exception e)
        {
            throw new Exception("Outer", e);
        }
    }

    static void ThrowException2()
    {
        throw new Exception("Inner");
    }
}

Tạo ra đầu ra này:

System.Exception: Outer ---> System.Exception: Inner
   at Test.ThrowException2()
   at Test.ThrowException()
   --- End of inner exception stack trace ---
   at Test.ThrowException()
   at Test.Main()


1
  catch (Exception ex)
{
    Console.WriteLine(ex.StackTrace);
}

1
Điều đó sẽ không bao gồm thông báo hoặc chi tiết ngoại lệ bên trong.
Drew Noakes

0

Không có API ghi nhật ký C # nào có thể lấy Ngoại lệ làm đối số và xử lý mọi thứ cho bạn, giống như Log4J của Java làm?

Tức là, sử dụng Log4NET.


Tôi nghĩ nó chỉ ra lý do tại sao Microsoft có thể không cung cấp chức năng như vậy trong C # mà Java đã làm (là ngôn ngữ cũ được phát triển trong thời gian đơn giản hơn). Tức là, có một cách tốt hơn được khuyến khích.
JeeBee

0

Vì câu trả lời @ ryan-cook không phù hợp với tôi, nếu bạn muốn in dấu vết ngăn xếp mà không có ngoại lệ, bạn có thể sử dụng:

System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace();
Console.WriteLine(stackTrace)

Rất tiếc, điều này không thể thực hiện được trong PCL hoặc trong Thư viện .NETStandard


-1

Ngoài ra, hãy xem Log4Net ... nó là một cổng của Log4J sang .NET.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.