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 :blush:

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

5 Likes

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é:

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;
}

Tks bạn nhé :heart_eyes:

1 Like

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

1 Like

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.

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.

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

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

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

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ỉ

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 à?

Uk. Mình dùng VS 2015

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;
	}
}

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

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

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

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

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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?