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++
Trả lời
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 const
và volatile
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.
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.
Đố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ươnganObject
, và đối xử với nó như là một đối số giá trị: nó tạo ra một bản sao củaanObject
. - 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ứcconst
.
- 1. Vứt bỏ phạm vi ngoại lệ trong C++
- 2. Vi phạm truy cập ngoại lệ Java?
- 3. Chức năng-phạm vi constructor tĩnh của đối tượng ném một ngoại lệ
- 4. Entity Framework One-To-Many Insert - Ngoại lệ vi phạm
- 5. Vi phạm các ngoại lệ của riêng bạn trong IntelliJ
- 6. Cách viết phạm vi với đối tượng thuộc đối tượng?
- 7. Phạm vi quản lý và tuổi thọ đối tượng Trong phạm vi STL Vectors
- 8. java.lang.IllegalArgumentException: pointerIndex ra khỏi phạm vi ngoại lệ - dispatchTouchEvent
- 9. Đúc một số ngoài phạm vi đến một enum trong C# không tạo ra ngoại lệ
- 10. Chỉ mục ngoài phạm vi ngoại lệ trong 2D Array (C#)
- 11. Ngăn chặn VS C# Đơn vị kiểm tra vi phạm về ngoại lệ
- 12. Phạm vi liên kết phạm vi C tiêu chuẩn
- 13. Ngoại lệ Java và Ngoại lệ C++
- 14. Đời sống đối tượng ngoại lệ
- 15. Phạm vi biến trong C++
- 16. thuộc tính đối tượng truy cập trong phạm vi đối tượng
- 17. Phạm vi khóa trong C#: là đối tượng trả về vẫn "bị khóa"?
- 18. Điểm ngắt tại ngoại lệ trong Eclipse - cách kiểm tra đối tượng Ngoại lệ?
- 19. Ngoại lệ trong các trường hợp ngoại lệ trong C++
- 20. Phạm vi hợp lệ của rowid SQLite?
- 21. Ví dụ Xtext của một đối tượng có phạm vi
- 22. Đối tượng được tạo bên trong phạm vi được deallocated ngay cả khi được sử dụng ngoài phạm vi
- 23. Kiểm tra đối tượng vi phạm mục tiêu
- 24. C# finalizer ném ngoại lệ?
- 25. Có thể bắt ngoại lệ vi phạm quyền truy cập trong .NET không?
- 26. Mạo danh một người sử dụng trong phạm vi sai không ném ngoại lệ
- 27. Ngoại lệ trong chuỗi "chính" java.lang.StringIndexOutOfBoundsException: Chỉ mục chuỗi nằm ngoài phạm vi: 11
- 28. Phạm vi mã trong Java với EclEmma không quét các phương thức ngoại lệ mong đợi
- 29. Dừng visual studio từ vi phạm về ngoại lệ trong Task
- 30. Ngoại lệ C++; int hoặc std :: exception?
Bạn có hỏi về * đời * không? – Joren
Có .. khi nào thì nó sẽ bị hủy? – Naveen
Để 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