Vâng xin chào các bạn đam mê lập trình c++
Ngày hôm nay chúng ta sẽ cùng đi vào tìm hiểu về một kỹ thuật mới trong c++ cơ bản.
Đó là kỹ thuật xử lý ngoại lệ.
Trước hết chúng ta hiểu: ngoại lệ trong c++ là những tình huống không mong muốn xảy ra trong quá trình xử lý, và nó là tác nhân gây ra những lỗi khi chương trình chạy, làm chết chường trình, đơ máy tính…..
Ví dụ:
+ Bạn cấp pháp một số lượng vùng nhớ quá lớn, khiến bộ nhớ cấp phát không đủ nên việc cấp phát bị lỗi mà chúng ta không nghĩ đến tình huống này.
+ Bạn chia hai số a và b, và giá trị của b được truyền vào, nhưng quên kiểm tra điều kiện b có bằng 0 hay 0
+ Bạn lập trình giao tiếp truyền dữ liệu qua các cổng port của máy tính, nhưng việc mở cổng bị thất bại….
Đó là những ví dụ cơ bản cho các ngoại lệ có thể xảy ra, ngoài ra còn rất nhiều các ngoại lệ khác.
Vậy thì khi ngoại lệ xảy ra, mà chúng ta không kiểm soát, thì chương trình của chúng ta sẽ bị chết giữa chừng, làm ảnh hưởng đến hệ thông đang xử lý.
Tối ví dụ: Bạn test một phần mềm, bạn thiết lập rất nhiều các thông số, một loạt các thao tác. Sau đó bạn chạy phần mềm.
Nếu chúng ta có kiểm soát ngoại lệ, thì khi xảy ra ngoại lệ chúng ta có thể đưa ra thông báo và xử lý ngoại lệ hợp lý đảm bảo phần mềm vẫn chạy, mà chỉ stop chức năng đang bị xảy ra ngoại lệ.
Nếu chúng ta không bắt ngoại lệ, lỗi xảy ra, chương trình bị đơ, và chết, chúng ta lại phải bật lại chương trình, thiết lập một loạt các thông số dữ liệu mới để test,…
Điều này gây mát thời gian khi một chức năng nhỏ làm ảnh hướng đến cả hệ thống.
Do đó chúng ta phải có cơ chế xử lý ngoại lệ.
Để xử lý ngoại lệ người ta sử dụng hai từ khóa cơ bản sau:
Try : (nghĩa là nếu bạn cố làm một điều gì đó)
Catch: (Thì nếu hậu quả xảy ra, sẽ lập tức chộp lấy để chờ xử lý.)
Hãy xem ví dụ sau:
try
{
int* dataArr = new int[4000];
}
catch(exception& e)
{
cout << "Standard exception: " << e.what() << endl;
}
return0;
}
Nếu việc cấp phát mà bị lỗi, lập tức bắt lấy lỗi và đưa ra thông báo….
Từ khóa Throw:
Từ khóa này cho phép một hàm có thể ném ra một ngoại lệ khi nó xảy ra.
Ví dụ như sau:
+ Tôi viết một hàm SendData(). Hàm này có thể xảy ra 2 ngoại lệ như sau:
- Cổng port không được mở
- Trong quá trình truyền thì mạng bị mất:
- Trong quá trình truyền thì mạng bị mất:
SendData()
{
if (port chưa được mở )
throw IOException(“Port is not opened”);
if (mạng mất)
throw NetworkStatusException(“Disconected”);
}
Vậy thì lúc này SendData có 2 ngoại lệ rất đặc trưng do chúng ta sử dụng throw để bắn ra khi điều kiện ngoại lệ xảy ra.
Dó đó khi sử dụng hàm SendData, chúng ta có thể thực hiện bắt ngoại lệ như sau
Try
{
SendData();
}
Catch(const IOException& e)
{
cerr << e.what();
}
Catch(const NetworkStatusException& e )
{
cerr << e.what();
}
Một ví dụ khác:
#include <iostream>
using namespace std;
double Division(int val_1, int val_2)
{
if( val_2 == 0 )
{
throw "val_2 is zero in division";
}
return (val_1/val_2);
}
int main ()
{
int x = 10;
int y = 0;
double ret = 0.0;
try {
ret = Division(x, y);
cout << ret << endl;
}catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
_________________________________________________________________________
Damme88(Phamtoanbonmat@gmail.com)
Damme88(Phamtoanbonmat@gmail.com)

Không có nhận xét nào:
Đăng nhận xét