Tải bản đầy đủ (.pdf) (83 trang)

Bài giảng Kỹ thuật lập trình hệ cơ điện tử: Chương 13 - TS. Đặng Thái Việt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.16 MB, 83 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

KỸ THUẬT LẬP TRÌNH HỆ CƠ ĐIỆN 
TỬ
Programming Engineering in Mechatronics
Giảng viên: TS. TS. Đặng Thái Việt
Đơn vị: Bộ mơn Cơ điện tử, Viện Cơ khí

Hà Nội, 09/2017

1


CHƯƠNG 13. C++ nâng cao
13.1  Xử lý ngoại lệ (Exception Handling)
13.2  Bộ nhớ động
13.3  Namespace
13.4  Template
13.5 Bộ tiền xử lý (Preprocessor)
13.6 Xử lý tín hiệu (Signal Handling)
13.7 Đa luồng (Multithread)
13.8 Một số lớp quan trọng

2


Xử lý ngoại lệ (Exception Handling)
Giới thiệu





Một Exception (ngoại lệ) là  một  vấn  đề  xuất  hiện  trong 
khi thực thi một chương trình. Một Exception trong C++ là 
một  phản  hồi  về  một  tình  huống  ngoại  lệ  mà  xuất  hiện 
trong khi một chương trình đang chạy, ví dụ như chia cho 
số 0.
Exception cung cấp một cách để truyền điều khiển từ một 
phần  của  một  chương  trình  tới  phần  khác.  Exception 
Handling (Xử lý ngoại lệ) trong C++ được xây dựng dựa 
trên 3 từ khóa là: try, catch, và throw.

3


Xử lý ngoại lệ (Exception Handling)
Giới thiệu
§

§

§

throw: Một chương trình ném một Exception khi một vấn 
đề  xuất  hiện.  Việc  này  được  thực  hiện  bởi  sử  dụng  từ 
khóa throw trong C++.
catch: Một  chương  trình  bắt  một  Exception  với  một 
Exception  Handler  tại  vị  trí  trong  một  chương  trình  nơi 
bạn muốn xử lý vấn đề đó. Từ khóa catch trong C++ chỉ 
dẫn việc bắt một exception.
try: Một  khối try có  thể  được  bắt  bởi  một  số  lượng  cụ 

thể  exception.  Nó  được  theo  sau  bởi  một  hoặc  nhiều 
khối catch.
4


Xử lý ngoại lệ (Exception Handling)
Giới thiệu


Giả  sử  một  khối  sẽ  tạo  một  Exeption,  một  phương  thức 
bắt  một  exception  bởi  sử  dụng  kết  hợp  các  từ 
khóa try và catch.  Một  khối  try/catch  được  đặt  xung 
quanh code mà có thể tạo một exception. Code bên trong 
một  khối  try/catch  được  xem  như  là  code  được  bảo  vệ, 
và cú pháp để sử dụng try/catch trong C++ như sau:

5


Xử lý ngoại lệ (Exception Handling)
Giới thiệu

6


Xử lý ngoại lệ (Exception Handling)
Ném Exception trong C++


Exception có thể bị ném ở bất cứ đâu bên trong một khối 

code  bởi  sử  dụng  các  lệnh throw trong  C++. Tốn  hạng 
của lệnh throw quyết định kiểu cho exception và có thể là 
bất kỳ biểu thức nào và kiểu kết quả của biểu thức quyết 
định kiểu của exception bị ném.

7


Xử lý ngoại lệ (Exception Handling)
Bắt Exception trong C++


Khối catch theo  sau  khối  try  trong  C++  sẽ  bắt  bất  kỳ 
exception  nào.  Bạn  có  thể  xác  định  kiểu  của  exception 
bạn  muốn  bắt  và  điều  này  được  xác  định  bởi  khai  báo 
exception  mà  xuất  hiện  trong  các  dấu  ngoặc  đơn  theo 
sau từ khóa catch trong C++.

8


Xử lý ngoại lệ (Exception Handling)
Bắt Exception trong C++


Code  trên  sẽ  bắt  một  exception  có  kiểu 
là ten_Exception. Nếu bạn muốn xác định rằng một khối 
catch  nến  xử  lý  bất  kỳ  kiểu  exception  nào  bị  ném  trong 
một khối try, bạn phải đặt một dấu ba chấm (…) trong các 
dấu ngoặc đơn theo sau từ khóa catch, như sau:


9


Xử lý ngoại lệ (Exception Handling)
Ví dụ

10


Xử lý ngoại lệ (Exception Handling)
Ví dụ

11


Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++


C++  cung  cấp  một  danh  sách  các  Standard  Exception 
được  định  nghĩa  trong <exception> mà  chúng  ta  có  thể 
sử  dụng  trong  các  chương  trình.  Những  exception  này 
được sắp xếp theo cấu trúc thứ tự cha-con như sau:

12


Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++


13


Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++


C++  cung  cấp  một  danh  sách  các  Standard  Exception 
được  định  nghĩa  trong <exception> mà  chúng  ta  có  thể 
sử  dụng  trong  các  chương  trình.  Những  exception  này 
được sắp xếp theo cấu trúc thứ tự cha-con như sau:

14


Xử lý ngoại lệ (Exception Handling)
Standard Exception trong C++
Exception

Miêu tả

std::exception

Một exception và lớp cha của tất cả Standard Exception trong C++

std::bad_alloc

Có thể được ném bởi new


std::bad_cast

Có thể được ném bởi dynamic_cast

std::bad_exception

Đây là thiết bị hữu ích để xử lý Unexpected Exception trong một chương trình C++

std::bad_typeid

Có thể được ném bởi typeid

std::logic_error

Một exception mà theo lý thuyết có thể được phát hiện bởi việc đọc code

std::domain_error

Đây là một exception được ném khi một miền tốn học khơng hợp lệ được sử dụng

std::invalid_argument

Được ném do các tham số khơng hợp lệ

std::length_error

Được ném khi một std::string q lớn được tạo ra

std::out_of_range


Có thể được ném bởi một phương thức, ví dụ std::vector và std::bitset<>::operator[]().

std::runtime_error

Một exception mà theo lý thuyết khơng thể được phát hiện bởi việc đọc code

std::overflow_error

Được ném nếu một sự tràn luồng tốn học (mathematical overflow) xuất hiện

std::range_error

Xuất hiện khi bạn cố gắng lưu giữ một giá trị bên ngồi dãy giá trị

std::underflow_error

Được ném nếu một mathematical underflow (sự tràn dưới) xuất hiện

15


Xử lý ngoại lệ (Exception Handling)
Định nghĩa Exception mới trong C++


Bạn có thể định nghĩa các exception cho riêng bạn bằng 
việc kế thừa và ghi đè tính năng lớp exception trong C++. 
Ví  dụ  sau  minh  họa  cách  bạn  có  thể  sử  dụng  lớp 
std::exception để triển khai exception của riêng bạn theo 
một cách chuẩn trong C++:


16


Xử lý ngoại lệ (Exception Handling)
Định nghĩa Exception mới trong C++

17


Bnhng
Khỏinim
ã

Đ

Đ

ã

B nh trong chng trỡnh C/C++ ca bn c phõn
thnhhaiphn:
Stack:Ttcbinckhaibỏobờntronghmsnhnb
nhtstacktrongC/C++.
Heap: Được  sử  dụng  để  cấp  phát  bộ  nhớ  động  khi  chương 
trình chạy.

Nhiều  khi,  bạn  khơng  biết  trước  bao  nhiêu  bộ  nhớ  bạn 
sẽ  cần  để  lưu  thông  tin  cụ  thể  trong  một  biến  đã  được 
định  nghĩa  và  kích  cỡ  bộ  nhớ  cần  thiết  có  thể  được 

quyết định tại run time.
18


Bộ nhớ động
Khái niệm




Bạn có thể cấp phát bộ nhớ tại run time bên trong Heap 
cho biến đó với một kiểu đã cho bởi sử dụng một tốn tử 
đặc biệt trong C/C++ mà trả về địa chỉ của khơng gian đã 
cấp phát. Tốn tử này gọi là tốn tử new trong C/C++.
Nếu  bạn khơng cần thiết bộ nhớ động đã cấp  phát  nữa, 
bạn  có  thể  sử  dụng  tốn  tử delete trong  C/C++,  sẽ  giải 
phóng  bộ  nhớ  đã  được  cấp  phát  trước  đó  bởi  tốn  tử 
new.

19


Bộ nhớ động
Tốn tử new và delete trong C/C++




Đây  là  cú  pháp  chung  để  sử  dụng  tốn  tử new để  cấp 
phát bộ nhớ động cho bất kỳ kiểu dữ liệu nào trong C/C+

+:

Ở đây, kieu_du_lieu có thể là bất kỳ kiểu dữ liệu có sẵn 
nào ví dụ như mảng hoặc các kiểu dữ liệu tự định nghĩa 
như lớp hoặc cấu trúc.

20


Bộ nhớ động
Ví dụ

21


Bộ nhớ động
Tốn tử new và delete trong C/C++


Tại bất kỳ thời điểm, khi bạn cảm thấy một biến đã được 
cấp  phát  động  là  khơng  cần  thiết  nữa,  bạn  có  thể  giải 
phóng bộ nhớ mà nó đã chiếm giữ trong phần bộ nhớ rỗi 
với tốn tử delete trong C/C++, như sau:

22


Bộ nhớ động
Ví dụ


23


Bộ nhớ động
Cấp phát bộ nhớ động cho Mảng trong C/C++

24


Bộ nhớ động
Cấp phát bộ nhớ động cho Đối tượng

25


×