2015-09-15 14 views
5
static void Main(string[] args) 
{ 
    try 
    { 
     Console.WriteLine("No Error"); 
    } 
    catch (DataException) /*why no compilation error in this line?*/ 
    { 
     Console.WriteLine("Error...."); 
    } 
    Console.ReadKey(); 
} 

Mã được biên dịch mà không có bất kỳ lỗi nào. Tôi không hiểu tại sao dòng đầu tiên của khối catch không đưa ra bất kỳ lỗi biên dịch -C# catch (DataException) - không có biến nào được xác định

catch (DataException)

tham số DataException của khối catch sẽ được một lớp học, và nó sẽ có một biến tiếp theo để nó như -

catch (DataException d)

có thể ai đó giải thích các hành vi trên?

+1

Đây là cú pháp hợp lệ khi bạn chỉ quan tâm loại ngoại lệ nào xảy ra, nhưng không cần theo dõi ngăn xếp, v.v. – Blorgbeard

+0

Trong trường hợp bạn không cần 'd' – Eric

Trả lời

5

Trong phần 8.10 trong số C# 5.0 spec, bạn sẽ tìm thấy định nghĩa cú pháp cho try/catch (xin lỗi cho các định dạng):

catch-mệnh đề:
        cụ-catch-khoản               chung -catch-clause opt
        specific-catch-clauses opt     chung-catch-khoản
cụ-catch-mệnh đề:
        cụ-catch-khoản
        cụ-catch-khoản         cụ-catch-khoản
specific-catch-clause:
        catch         (         đẳng cấp loại         định danh opt         )         khối
chung-catch-khoản:
        catch         khối

Vì vậy, bạn có thể thấy rằng catch { }, catch (Exception) { }catch (Exception ex) { } đều hợp lệ theo đặc điểm kỹ thuật.

Nếu bạn không chỉ định mã định danh tùy chọn trong khối catch, thì bạn không thể truy cập bất kỳ chi tiết ngoại lệ nào - nhưng đôi khi bạn không cần, vì vậy bạn không nên khai báo biến mà bạn không muốn t có ý định truy cập.

2

catch không phải là phương pháp. bạn không cần tham số bên cạnh loại. không có tham số và chỉ với kiểu, ngoại lệ của kiểu cụ thể đó sẽ được xử lý với khối catch đó nhưng các chi tiết sẽ bị bỏ qua.

catch (DataException) cho phép bạn biết loại ngoại lệ, nhưng bạn không thể lấy chi tiết. Ví dụ:

ví dụ, tôi đã viết ngoại lệ tùy chỉnh và ghi đè Message để định dạng thư của tôi. với catch (ExceptionType), bạn không thể truy cập message.with catch (ExceptionType d), bạn có thể truy cập với d.Message

2

Cách hiện bạn đã viết nó có nghĩa là bạn đang nói trình biên dịch rằng khi một ngoại lệ kiểu DataException sẽ được ném ra, khối catch này cần được xử lý. Và với cách bạn đã viết nó, bạn sẽ không có bất kỳ biến nào có ngoại lệ được lưu trữ để bạn truy cập sau này.

Thông thường, một dòng mã đơn (không phải là một khối dòng) có thể ném nhiều loại Ngoại lệ. Bạn muốn xử lý khác nhau cho từng loại ngoại lệ.

Các vấn đề liên quan