01/10/2018, 08:59

Hỏi về cách dừng một hàm khi điều kiện sai

Hàm void thì dừng chương trình bằng return;. Còn các hàm có giá trị trả về thì dừng khi điều kiện sai kiểu gì ạ. Mình nói hơi khó hiểu. Mọi người xem vd sẽ hiểu ý của mình:
Vd: hàm tính thương

float tinhTHuong(float a, float b) {
	if (b == 0) // thi dung chuong trinh nhung o day phai return 1 gia tri
}

Lúc học TH thầy mình có nói sơ là dùng xử lý ngoại lệ throw. Mình tìm hiểu thì ra try catch khá phức tạp nhưng mục đích của em chỉ là dừng chương trình thôi. Mong mọi người giải đáp giúp mình

*grab popcorn* viết 11:06 ngày 01/10/2018

Bạn có thể dùng assert()
http://en.cppreference.com/w/cpp/error/assert

Chien Dang viết 11:04 ngày 01/10/2018

Lúc học TH thầy mình có nói sơ là dùng xử lý ngoại lệ throw. Mình tìm hiểu thì ra try catch khá phức tạp

Bạn tìm hiểu thiếu rồi, throw exception ko nhất thiết phải dùng try catch, nếu bạn muốn đơn giản chỉ cần dùng throw thôi là nó sẽ dừng chương trình. Xem ví dụ tương tự như của bạn ở đây nhé:

stackoverflow.com
Terry Li

How to throw a C++ exception

c++, exception-handling
asked by Terry Li on 08:51PM - 12 Dec 11

Tao Không Ngu. viết 11:08 ngày 01/10/2018

Hi Kira.
Có hai phong cách code.
1 Code có tâm. Kiểm tra các biến truyền vào lỗi nén ngoại lệ hoặc return.
2 Code không có tâm. Chỉ kiển tra các biến khai báo mới trong hàm. Các biến truyền vào gây lỗi không quan tâm.

Mình chỉ code theo cách 2.

/// Kiem tra b khac 0 truoc khi goi ham.
float tinhTHuong(float a, float b) {
	return a / b;
}
Kira viết 11:08 ngày 01/10/2018

Tks bạn nhé

Kira viết 11:13 ngày 01/10/2018

Code kiểu này dễ gây thù hằn lắm

Tao Không Ngu. viết 11:06 ngày 01/10/2018

Hi Kira. (death note).
Nó làm code của bạn sạch hơn. Bớt các bước kiểm tra thừa.

Trần Hoàn viết 11:08 ngày 01/10/2018

Kiểu có tâm:

float? TinhThuong(float a, float b) //khác với float, float? cho phép null
{
    try
    {
        return a / b;
    }
    catch
    {
        return null;
    }
}

Kiểu rảnh hơi kiểm tra đủ các loại điều kiện, trong trường hợp này chỉ check b==0:

float? TinhThuong(float a, float b)
{
    if (b == 0)
        return null;
    return a / b;
}

Nếu mà là C# thì bạn không cần quăng exception, chương trình sẽ tự quăng, trừ khi bạn muốn đánh lừa bọn “hacker” chuyên crack phần mềm bằng cách quăng exception giả để che exception thật.

Kira viết 11:11 ngày 01/10/2018

return null là trả về 0 rồi bạn khác nào 2/0 = 0. Ở đây mình muốn 2/0 nó sẽ hiện ra dòng lệnh không thực hiện phép chia và dừng chương trình

gioi viết 11:14 ngày 01/10/2018

Code theo cách 2 thì làm sao qua được bước Unit Test vậy bác???

Kira viết 11:05 ngày 01/10/2018

debug hiện lỗi chương trình ko chạy được bạn à

Kira viết 11:15 ngày 01/10/2018

Mình làm theo như vậy chương trình lỗi không chạy được

using namespace std;

int compare(int a, int b) {
	if (a < 0 || b < 0) {
		throw std::invalid_argument("received negative value");
	}
}
int main() {

	cout << compare(-2, 4);
	system("pause");
}

Mình tưởng nó sẽ in ra câu "received negative value" chứ nhỉ

viết 10:59 ngày 01/10/2018

terminate called after throwing an instance of ‘std::invalid_argument’
what(): received negative value

chỗ what() nó in ra đó

edit: chắc đang xài VS à?

Kira viết 11:15 ngày 01/10/2018

Uk. Mình dùng VS 2015

gioi viết 11:05 ngày 01/10/2018

Nếu kẹt quá thì mình sẽ làm như vầy:

bool tinhTHuong(float a, float b, float& RESULT_OUT) {
	if (b == 0){
		return false;
	}else{
		...
		return true;
	}
}
Kira viết 11:14 ngày 01/10/2018

Không thiết thực cho lắm ạ. Mong có ai rành cái này giải đáp dùm mình

Tao Không Ngu. viết 11:06 ngày 01/10/2018

Hi gioi.
Truyền biến sai cũng là một test mà. @_@!

gioi viết 11:14 ngày 01/10/2018

Không biết bạn đã làm UnitTest chưa???

Kira viết 11:03 ngày 01/10/2018

UnitTest là sao bạn. Hình như mọi người không hiểu ý của mình thì phải

Ice Tea viết 11:11 ngày 01/10/2018

Bạn throw ra thì phải try...catch nó lại, trong hàm main

Kira viết 11:09 ngày 01/10/2018

Bắt buộc phải có ạ. Mình cứ tưởng không có cũng được chứ @@

Bài liên quan
0