Theo mình thì điều đó không cần thiết. Vì khi thực hiện khối try - catch, nó sẽ thực hiện các lệnh nằm bên trong khối try, nếu hàm XXX đó có bị Exception thì nó cũng sẽ qua khối catch bên ngoài
foreach (var FileName in list)
try
{
XXX(FileName); //Nếu code chạy đúng,thoát khỏi khối try và catch. Ngược lại thì chạy vào khối catch
}
catch (System.IO.FileNotFoundException)
{
xxx("File not found"); //Chỉ thực hiện nếu khối try có Exception
}
Trừ trường hợp “tự làm khó mình” đây trường hợp “có thật” do mình làm ra 
Hàm XXX(Config config)
: kết nối CSDL SQLite sử dụng đối tượng config
public static void XXX(Config config)
{
try
{
SQLiteConnection con = new SQLiteConnection(
"Data Source = " + config.dataSource + "; "
+ "Version = " + config.version + "; "
+ "Password = " + config.password);
con.Open();
}
catch(Exception)
{
Console.WriteLine(e.ToString());
}
}
Hàm YYY()
: đọc config
từ file
public static void YYY()
try
{
//Muốn đọc config từ file temp
SQLiteConfig config = SQLiteConfigJson.openTemp();
XXX(config);
}
catch
{
//Có file config tạo sẵn, không cần đọc file temp nữa
SQLiteConfig config = SQLiteConfigJson.open();
XXX(config);
}
}
Chạy hàm YYY()
với trường hợp muốn đọc file config có sẵn và không có file temp (đối tượng config lúc này sẽ là null
) . Sau đó chạy tiếp hàm XXX(config)
với một config = null
, nó sẽ qua khối catch của hàm XXX
và thực hiện câu lệnh Console.WriteLine(e.ToString());
: in ra message NullReferenceException
ra màn hình console. Sau đó… thoát ra khối catch của hàm XXX
và tiếp tục chạy trong khối try của hàm YYY
! (đó là điều không mong muốn)
Quy trình như sau:
public static void YYY()
try
{
//Muốn đọc config từ file temp
SQLiteConfig config = SQLiteConfigJson.openTemp(); //Không có temp -> config = null
XXX(config); //Chạy vào trong hàm này
}
catch
{
//Có file config tạo sẵn, không cần đọc file temp nữa
SQLiteConfig config = SQLiteConfigJson.open();
XXX(config);
}
}
public static void XXX(Config config)
{
try
{
//Lỗi! NullReferenceException. Do config lúc nãy = null
//Bỏ qua try, sang catch
SQLiteConnection con = new SQLiteConnection(
"Data Source = " + config.dataSource + "; "
+ "Version = " + config.version + "; "
+ "Password = " + config.password);
con.Open();
SQLiteCommand com = new SQLiteCommand(con);
}
catch(Exception)
{
Console.WriteLine(e.ToString()); //Chạy câu lệnh này. Sau đó thoát khỏi catch
//Chạy tiếp try của hàm YYY vì hàm catch này đã xử lý NullReferenceException rồi
}
}
Vì thế đừng try - catch hay throw ra Exception trong các hàm con làm gì. Thêm rắc rối và khó sửa