有四件事情,兩個主要的和兩個小。一兩件事的時間...
1.重新拋出使用W/O激活的異常
一個throw;
語句用於重新引發當前捕獲的異常。例如:
try {
do_something();
} catch (const std::exception &) {
throw; // This statement re-throws an exception that was caught in this "catch" block.
}
在你的情況,使用的是沒有throw;
捕獲任何異常(爲了話 - 它不會出現內部catch
塊直接或間接地),從而程序被終止。當需要拋出異常並且不要重新拋出異常時,就像你的情況一樣,你必須指定一個拋出的異常對象。例如:
throw std::runtime_error("Something bad happened");
2.包羅萬象的不子句重新拋出捕獲的異常
你包羅萬象的條款(catch (...)
)是完全合法的C++。但是,它不會重新拋出異常。儘管它是一個合法的C++代碼,但這種用法是一個禁忌。 C和C++運行時通常使用特殊類型的異常來實現某些功能。例如,NPTL正在使用異常來實現線程取消。如果您使用catch (...)
捕捉到該異常,則線程將不會被取消,並且您將會遇到不愉快的時間。一般來說,你必須通過類型來捕獲異常。在幾乎所有情況下,例外都是從std::exception
繼承,因此您必須編寫catch (const std::exception &)
或者,如果您希望獲得確切類型,則可以使用 - catch(const TypeYouExpect &)
。但是,如果您必須使用全部捕獲,請記住重新投擲。例如:
try {
do_something();
} catch (...) {
throw; // DO NOT FORGET TO RE-THROW.
}
3.標題命名...
您包括C頭,而C++提供了自己的首部標準C的功能。所以,頭:
#include <stdio.h>
..應該是:
#include <cstdio>
C++特定的C函數得到特殊待遇。例如,它們在std
命名空間中可用。因此,您可以使用std::open()
而不是僅使用open()
或::open()
。沒什麼大不了的,但強烈推薦。
4.從主返回。
與C不同,C++的main()
函數非常特殊。它允許你不要有return 0;
。這是一個默認行爲。所以,除非你真的需要返回一些價值,否則你可以通過不輸入return 0;
來節省一些時間。不過請記住,main
是唯一類似的功能,除非函數被標記爲void
,否則您必須明確地返回其他任何地方。
希望它有幫助。祝你好運!
您的代碼看起來比C C_ish_方式++ _ ish_,只是習慣代碼在C++中,如果你選擇C++爲首選語言,這樣一來你的代碼很容易成爲一種奇怪的混合語言,沒有任何好處,只會讓你的生活變得更加難以學習新東西和有用的東西。的確,C在C++下是沒有問題的,但只是在編碼時嘗試使用更簡單和更線性的方法。 – Ken