2013-01-14 45 views
6

Tôi có đoạn mã sau:Việc ném một ngoại lệ trong một phương thức có khiến phương thức trả về không?

public static Point operator /(Point point, double value) 
    { 
     if (value == 0) 
     { 
      throw new DivideByZeroException("Cannot divide by zero"); 
      return Point.Origin; 
     } 
     return new Point(point.X/value, point.Y/value, point.Z/value); 
    } 

Và câu lệnh return đầu tiên (return Point.Origin;) được gạch chân màu xanh lá cây trong Visual Studio. Thông báo cho biết "Mã không thể truy cập được phát hiện" khi con trỏ được di chuột qua văn bản được gạch dưới. Điều này dẫn tôi đến câu hỏi của tôi được nêu trong dòng tiêu đề:

Việc ném ngoại lệ trong một phương thức có khiến phương thức trả lại không?

+1

Cảm ơn, tôi hiểu Bây giờ: Việc ném một ngoại lệ trong một phương thức làm cho luồng thực thi của chương trình đi tới một trình xử lý ngoại lệ thích hợp trong phương thức, (chẳng hạn như câu lệnh bắt hoặc cuối cùng) nếu có, hoặc thoát khỏi phương thức và đi lên ngăn xếp cuộc gọi cho đến khi nó được xử lý. Trong mọi trường hợp, mã khác trong phương thức sau khi 'ném ngoại lệ mới' và bên ngoài bất kỳ khối catch/finally nào sẽ không bao giờ được thực thi. Và để làm rõ và trả lời câu hỏi, phương thức không trả về một giá trị, nhưng nó "trả về" theo nghĩa là thực thi chương trình trả về phương thức gọi. –

Trả lời

1

Việc ném ngoại lệ trong phương thức có khiến phương thức trả lại không?

Có. Việc thực hiện một phương thức bị gián đoạn, vì vậy phương thức trả về luồng thực thi. Nhưng không có giá trị nào được trả lại, bạn đã xác định nó với câu lệnh return. Không có dòng nào sau throw new trong phương thức hiện tại đang được thực hiện, ngoại trừ các khối catchfinally tương ứng. Vì vậy, bạn không phải trả lại giá trị sau khi ném một ngoại lệ.

Visual Studio gạch dưới các khối mã mà bạn không thể tìm thấy mã. Trong trường hợp cụ thể của bạn, câu lệnh return Point.Origin; sẽ không bao giờ được thực thi để bạn có thể xóa nó.

+0

Nó thực sự là một hành vi giống như 'return'? Bởi vì về mặt kỹ thuật hàm không trả về một giá trị nhưng nó báo hiệu một ngoại lệ. Liệu tôi có sai? – cheesemacfly

+0

Bạn nói đúng. Chúng tôi đang nói về sự trở lại của dòng chảy thực hiện, không trả về giá trị. 'gây ra phương thức trả về' có thể được coi là' nguyên nhân để trả về luồng thực thi' hoặc 'nguyên nhân trả về giá trị': đầu tiên nếu đúng, thứ hai là sai. –

+0

@cheesemacfly - một ngoại lệ _aborts_ phương pháp, trả về giá trị không thành vấn đề. –

0

Có, việc ném ngoại lệ sẽ khiến phương thức trả lại ngay lập tức.

Tuy nhiên, đây không phải là sự trở lại bình thường. Ví dụ, không có giá trị trả về. Cách duy nhất để nắm bắt quyền kiểm soát từ một phương thức quay trở lại như là kết quả của một ngoại lệ được ném ra, là có một trình xử lý ngoại lệ.

8

Vâng, điều này khiến cho phương thức thực hiện phương thức là thoát, có. Các trường hợp ngoại lệ được ném lên ngăn xếp, phương pháp gần nhất mà bắt nó. Nếu nó không ảnh hưởng đến luồng thực thi, nó sẽ là vô nghĩa.

Điều này không giống như phương thức trả về "bình thường" - nghĩa là không có ngoại lệ. Vì vậy, giả sử dụng phương pháp gọi điện thoại thăm:

Point foo = bar/baz; 
Console.WriteLine("Done"); 

Trong trường hợp này Console.WriteLine() gọi sẽ không thực hiện nếu các nhà điều hành bộ phận ném một ngoại lệ. Thay vào đó, hoặc trừ sẽ được bắt gặp trong phương pháp này, hoặc trừ sẽ tuyên truyền để người gọi phương pháp đó vv

(finally khối sẽ được thực hiện trên đường đi quá.)

Có lẽ đáng đọc hướng dẫn MSDN đến "handling and throwing exceptions".

1

Không chính xác. Khi một ngoại lệ được ném, nếu bị bắt, nó sẽ nhảy tới mã xử lý trong phương thức. Từ đó nó có thể làm bất cứ điều gì bạn muốn. Nếu không bị bắt chước như trong ví dụ của bạn, nó sẽ chuyển sang phương thức gọi là phương thức này và sẽ không bao giờ "trả về" một giá trị. Nó cũng sẽ không bao giờ quay trở lại để thực hiện dòng trả về bạn có sau khi bạn ném ngoại lệ.

2

Không, bởi vì ném ngoại lệ là không phải là trả lại.

Nếu ngoại lệ không được xử lý bên trong hàm, nó sẽ gây ra thoát khỏi hàm ngay lập tức, chuyển điều khiển đến điểm đầu tiên trong chương trình nơi ngoại lệ sẽ được nắm bắt tức là xử lý. (Kết quả trong một cái chết đột ngột của chương trình nếu nó không được xử lý.)

Kể từ khi chức năng sẽ thoát sau khi ném câu lệnh return là vô ích vì nó sẽ không bao giờ đạt được.,

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