2009-10-05 28 views
9

Có cách nào để trang trí một phương pháp sẽ thực hiện một số ghi chép, sau đó ném một ngoại lệ vô điều kiện, như vậy?Làm thế nào để đánh dấu một phương pháp sẽ ném vô điều kiện?

tôi có mã như thế này:

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // notice that x is not yet set here, but compiler doesn't complain 

    throw new Exception("missed something."); 
} 

Nếu tôi cố gắng viết nó như thế này tôi nhận được một vấn đề:

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // compiler complains about x not being set yet 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 

Bất kỳ lời đề nghị? Cảm ơn.

+0

Bạn gặp phải sự cố gì? –

+0

"x có thuộc tính và chưa được đặt ở cuối phương thức" – k0dek0mmand0

+1

Tôi bị nhầm lẫn - làm thế nào nó được ném vô điều kiện nếu nó không bị ném khi x được đặt (và trả về được thực hiện) – Matt

Trả lời

17

Làm thế nào về điều này?

bool condition() { return false; } 
int bar() { return 999; } 
void foo(out int x) 
{ 
    if (condition()) { x = bar(); return; } 
    // compiler complains about x not being set yet 
    throw MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
Exception MyMethodThatAlwaysThrowsAnException(string message) 
{ 
    //this could also be a throw if you really want 
    // but if you throw here the stack trace will point here 
    return new Exception(message); 
} 
2

Nếu bạn biết ngoại lệ sẽ luôn bị ném, tại sao lại quan trọng. Chỉ cần đặt biến để một cái gì đó để nó có thể biên dịch:

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    x = 0; 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+3

Đó chính xác là điều tôi muốn tránh làm.:) – k0dek0mmand0

0

Nó không trả lời câu hỏi của bạn, nhưng khi sử dụng các thông số ra nó luôn luôn là một ý tưởng tốt để khởi tạo chúng vào đầu của phương pháp. Bằng cách này bạn sẽ không có bất kỳ lỗi biên dịch:

void foo(out int x) 
{ 
    x = 0; 
    if(condition()) { x = bar(); return; } 
    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+4

Tôi nghĩ rằng các tham số nên được chỉ định khi nó có ý nghĩa hoặc vì nó có thể ngăn chặn một số lỗi ẩn tại thời gian biên dịch chỉ vì bạn quên chỉ định tham số tại một số đường dẫn mã. –

1

x là một ra tham số và phải được thiết lập trước khi bạn di chuyển về phía trước

+3

trừ khi ngoại lệ được ném – k0dek0mmand0

+1

Vẫn là chính sách tốt để đảm bảo rằng bất kỳ tham số nào được đặt sớm trong phương pháp và gán mặc định cho chúng nếu không. –

2

Không có cách nào đánh dấu một phương pháp theo cách này.

Có thể không liên quan, nhưng mẫu trong ví dụ của bạn, sử dụng thông số out, hơi lạ. Tại sao không chỉ có kiểu trả về trên phương thức?

int Foo() 
{ 
    if (condition()) return bar(); 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+0

Đó chỉ là một ví dụ đơn giản. Mã thực tế khá phức tạp. – k0dek0mmand0

+0

@ k0dek0mmand0: Tôi nghi ngờ rằng đó có thể là trường hợp. Tôi đoán bạn không may mắn - không có cách nào để nói với trình biên dịch rằng 'MyMethodThatAlwaysThrowsAnException' luôn ném. – LukeH

1

Nếu bạn không muốn phải đặt x, tại sao bạn không sử dụng tham số ref thay thế?

void foo(ref int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // nobody complains about anything 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
2

Đó là một chủ đề rất cũ nhưng tôi chỉ muốn thêm bạn nên viết nó khác nhau ngay từ đầu:

void foo(out int x) 
{ 
    if (!condition()) 
     MyMethodThatAlwaysThrowsAnException("missed something."); 

    x = bar(); 
    // and so on... 
} 

Đó biên dịch cách sẽ không phàn nàn và mã của bạn là nhiều hơn nữa rõ ràng.

+0

Mã thực tế có lẽ phức tạp hơn, do đó đề xuất của bạn có thể không có ý nghĩa. –

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