我有检查数据库中记录的图像名称的方法。如果有这样的话,我尝试用记录的路径加载图像。如果没有我加载默认图像。正确的地方处理文件没找到异常在哪里?
首先,我有我的整个方法的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
块,但是如果将来逻辑改变了,我可能想要抛出更多不同的异常,这是保持异常处理在方法本身中的另一个原因,而不是它被调用的地方,但另一方面...想读你的意见。