Tôi thường đồng ý với hầu hết các cảnh báo phân tích mã và tôi cố gắng tuân thủ chúng. Tuy nhiên, tôi đang có một thời gian khó khăn hơn với điều này:
CA1031: Không bắt các loại ngoại lệ chung
Tôi hiểu lý do cho quy tắc này. Nhưng, trong thực tế, nếu tôi muốn thực hiện cùng một hành động bất kể ngoại lệ bị ném, tại sao tôi lại xử lý từng người một cách cụ thể? Hơn nữa, nếu tôi xử lý các ngoại lệ cụ thể, điều gì sẽ xảy ra nếu mã tôi đang gọi thay đổi để đưa ra một ngoại lệ mới trong tương lai? Bây giờ tôi phải thay đổi mã của mình để xử lý ngoại lệ mới đó. Trong khi đó, nếu tôi đơn giản bắt được Exception
mã của mình thì không phải thay đổi.
Ví dụ: nếu Foo gọi Bar và Foo cần dừng xử lý bất kể loại ngoại lệ nào được ném bởi Bar, có bất kỳ lợi thế nào trong việc cụ thể về loại ngoại lệ mà tôi bắt được không?
Có lẽ một ví dụ tốt hơn:
public void Foo()
{
// Some logic here.
LogUtility.Log("some message");
}
public static void Log()
{
try
{
// Actual logging here.
}
catch (Exception ex)
{
// Eat it. Logging failures shouldn't stop us from processing.
}
}
Nếu bạn không bắt được một ngoại lệ chung ở đây, thì bạn phải nắm bắt mọi loại ngoại lệ có thể. Patrick có một điểm tốt OutOfMemoryException
không nên giải quyết theo cách này. Vậy nếu tôi muốn bỏ qua mọi ngoại lệ OutOfMemoryException
thì sao?
OutOfMemoryError
, tách biệt với Exception
cây thừa kế vì lý do đó
OutOfMemoryException
? Mã xử lý giống như mọi thứ khác?