2009-10-31 40 views
32

Phạm vi của đối tượng ngoại lệ trong C++ là gì? nó đi ra khỏi phạm vi ngay sau khi xử lý bắt được thực hiện? Ngoài ra, nếu tôi tạo một đối tượng ngoại lệ chưa được đặt tên và ném nó, thì trong khi bắt ngoại lệ đó có quan trọng không nếu tôi bắt nó bằng tham chiếu const hoặc tham chiếu không const?Phạm vi đối tượng ngoại lệ trong C++

+3

Bạn có hỏi về * đời * không? – Joren

+0

Có .. khi nào thì nó sẽ bị hủy? – Naveen

+8

Để làm rõ câu hỏi của Joren: thuật ngữ _scope_ thường đề cập đến vùng (các dòng mã) trong đó biến có tên.Từ _scope_ thường bị lạm dụng có nghĩa là _lifetime_, đó là, như bạn đã hiểu, biến này thực sự tồn tại trong bộ nhớ trong bao lâu. – Thomas

Trả lời

32

Khi biểu thức throw được đánh giá, một đối tượng ngoại lệ được khởi tạo từ giá trị của biểu thức. Đối tượng ngoại lệ được ném được loại của nó từ loại tĩnh của biểu thức ném bỏ qua bất kỳ vòng loại constvolatile nào. Đối với các loại lớp, điều này có nghĩa là khởi tạo sao chép được thực hiện.

Phạm vi của đối tượng ngoại lệ nằm ngoài phạm vi của khối nơi xảy ra sự cố. Hãy nghĩ về nó như đang sống trong một khu vực ngoại lệ đặc biệt ở một bên của ngăn xếp cuộc gọi thông thường nơi các đối tượng địa phương sinh sống.

Bên trong khối catch, tên được khởi tạo với đối tượng ngoại lệ đã bắt được khởi tạo với đối tượng ngoại lệ này chứ không phải đối số là throw, ngay cả khi đây là giá trị.

Nếu bạn catch qua tham chiếu không phải const, khi đó bạn có thể thay đổi đối tượng ngoại lệ, nhưng không thể thay đổi đối tượng được khởi tạo. Bạn có thể thay đổi hành vi của chương trình nếu bạn ném lại ngoại lệ theo những cách mà bạn không thể nếu bạn bị bắt bởi giá trị hoặc tham chiếu const (const_cast s sang một bên).

Đối tượng ngoại lệ bị phá hủy khi khối catch cuối cùng không thoát ra thông qua việc ném lại (nghĩa là đánh giá biểu thức ném tham số) hoàn thành.

4

Trước hết, đối tượng bạn ném ra ngoài phạm vi gần như ngay lập tức. Điều gì sẽ bị xử lý ngoại lệ bị bắt là một bản sao của đối tượng gốc. Bản sao đó sẽ bị xóa sau khi trình xử lý bắt được thực thi trừ khi bạn nắm bắt nó theo giá trị (không phải theo tham chiếu). Trong trường hợp này sẽ có một bản sao khác được tạo ra. Nhưng bạn nên bắt nó bằng cách tham chiếu (tốt nhất là const một) anyway.

+0

Điều gì về ném một con trỏ đến một cái gì đó theo MFC? Bạn cần phải xem xét các đối tượng khác với các đối tượng của loại lớp như ngụ ý trong câu hỏi và câu trả lời của bạn. – Sam

+0

Con trỏ được sao chép quá nhưng không ai quan tâm thường :) – vava

8

Đối tượng ngoại lệ chỉ có sẵn trong khối catch. Bạn không thể sử dụng đối tượng ngoại lệ bên ngoài khối catch. bước sau đây xảy ra khi bạn ném một ngoại lệ và bắt:

try 
{ 
MyException anObject; 
throw anObject; //1 

} 
catch(MyException exObject) 
{ 
} 
  • Các throw khoản (// 1) nhận đối tượng địa phương anObject, và đối xử với nó như là một đối số giá trị: nó tạo ra một bản sao của anObject.
  • trình xử lý catch bắt đối tượng MyException, một lần nữa là tham số giá trị. Tại thời điểm này, một bản sao khác được tạo.
  • Nếu trình xử lý catch đã triển khai để nhận tham chiếu đến đối tượng (catch (MyException &o)), bạn không thể sao chép lần thứ hai.
  • nếu catch trình xử lý nhận đối tượng ngoại lệ theo số const& thì bạn chỉ có thể gọi các phương thức const.
Các vấn đề liên quan