我有檢查數據庫中記錄的圖像名稱的方法。如果有這樣的話,我嘗試用記錄的路徑加載圖像。如果沒有我加載默認圖像。正確的地方處理文件沒找到異常在哪裏?
首先,我有我的整個方法的try-catch
塊,其中catch(Exception ex)
不管是什麼我剛回到Error loading image
例外:
if (File.Exists(imgPath + "\\" + imageName))
{
try
{
using (var temp = new Bitmap(imgPath + "\\" + imageName))
{
pictureBox1.Image = new Bitmap(temp);
}
if (pictureBox1.Image.Width > defaultPicBoxWidth)
{
pictureBox1.Width = defaultPicBoxWidth;
}
}
catch (Exception ex)
{
logger.Error(ex.ToString());
MessageBox.Show("Error loading image!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
後來我想通了,有時候我可能會在數據庫中的記錄,但由於某種原因,該文件可能會丟失,所以我爲補充檢查:
if (imageName != null && !File.Exists(imgPath + "\\" + imageName))
現在我需要爲這種情況下正確的消息了。我得出的結論是,我可以 - 使用幾個try-catch
塊來處理這些部分或拋出異常並處理調用該方法的異常。
我選擇了第二個選項,現在整個代碼爲:
if (imageName != null && !File.Exists(imgPath + "\\" + imageName))
{
throw new FileNotFoundException();
}
if (File.Exists(imgPath + "\\" + imageName))
{
//try
//{
using (var temp = new Bitmap(imgPath + "\\" + imageName))
{
pictureBox1.Image = new Bitmap(temp);
}
if (pictureBox1.Image.Width > defaultPicBoxWidth)
{
pictureBox1.Width = defaultPicBoxWidth;
}
//}
//catch (Exception ex)
//{
// logger.Error(ex.ToString());
// MessageBox.Show("Error loading image!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
//}
}
而這正是我所說的方法:
try
{
//The name of the method described above
LoadSavedOrDefaultImage(imageInfo, entity.Picture, txtCode.Text, imageLocation);
}
catch (FileNotFoundException ex)
{
logger.Error(ex.ToString());
MessageBox.Show("Error loading image! The file wasn't found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
LogErrorAndShowMessage(ex, Resources.ERROR_LOAD);
}
我喜歡這個更好,但我不能確切地說爲什麼。一般問題是 - 這是處理異常的正確方法。更具體的一個 - 在我的確切情況下,放置try-catch
區塊的更好的地方是哪裏?對我來說,在方法本身中是很有意義的,因爲這樣我就不需要編寫這些塊,我在任何地方都會調用這個方法,這樣就更加封裝了。另外現在有兩個try-catch
塊,但是如果將來邏輯改變了,我可能想要拋出更多不同的異常,這是保持異常處理在方法本身中的另一個原因,而不是它被調用的地方,但另一方面...想讀你的意見。