我有检查数据库中记录的图像名称的方法。如果有这种情况,我会尝试使用记录的路径加载图像。如果没有,我会加载默认图像。
首先,我将整个方法放在一个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
在我为我调用该方法的任何地方编写那些块,它以这种方式更加封装。现在还有两个try-catch
块,但是如果将来逻辑发生变化,我可能想抛出更多不同的异常,这是将异常处理保留在方法本身而不是在调用它的位置的另一个原因,但另一方面......我想要阅读您的意见。