如何在值返回方法中使用try catch块?

时间:2011-04-27 11:32:18

标签: c# asp.net

我正在注册表格中检查上传的图片,我需要使用try catch块。这是我的代码:

public bool CheckFileType(string FileName)
{
        string Ext = Path.GetExtension(FileName);
        switch (Ext.ToLower())
        {
            case ".gif":                   
                return true;
                break;
            case ".JPEG":                    
                return true;
                break;
            case ".jpg":                  
                return true;
                break;
            case ".png":                   
                return true;
                break;
            case ".bmp":                   
                return true;
                break;
            default:                  
                return false;
                break;
        }

}

请在这里建议我如何使用try catch块。

提前感谢。

4 个答案:

答案 0 :(得分:6)

更好的可以是这样,

 public bool CheckFileType(string FileName)
 {
    bool result = false ;

    try
     {
      string Ext = Path.GetExtension(FileName);
      switch (Ext.ToLower())
      {
        case ".gif":                   
        case ".JPEG":                    
        case ".jpg":                  
        case ".png":                   
        case ".bmp":                   
            result = true;
            break;
       }

      }catch(Exception e)
      {
         // Log exception 
      }
      return result;
     }

答案 1 :(得分:5)

有很多方法可以在返回值的方法中使用异常:

将您的return语句放在try-catch之外例如:

T returnValue = default(T);
try
{
    // My code
}
catch 
{
    // Exception handling code
}
return returnValue;

在您的捕获中放入一个return语句

try
{
    // My code
}
catch 
{
    // Handle exception
    return default(T);
}

抛出异常

你没有拥有来返回一个值,该方法只需要结束(例如,达到return语句或throw语句)。根据异常情况,返回值并不总是有效。

您应该仔细考虑何时以及如何捕获和处理异常:

  1. 什么可能失败?
  2. 为什么/怎么会失败?
  3. 失败后该怎么办?
  4. 在你的情况下:

    1. 唯一可能失败的语句是string Ext = Path.GetExtension(FileName);,如果FileName包含GetExtension,则根据documentation可能会失败。 (请注意,即使FileName为空,public bool CheckFileType(string FileName) { string Ext; try { Ext = Path.GetExtension(FileName); } catch (ArgumentException ex) { return false; } // Switch statement } 也不会返回null。
    2. 如果用户提供了包含这些无效字符的字符串,则可能会发生这种情况。
    3. 如果发生这种情况,我猜我们应该返回false,表明该路径无效(但这取决于应用程序)。
    4. 所以我可能会处理这样的异常:

      ArgumentException

      请注意,我们只捕获我们期望的异常(try),并且我们只将FileName语句放在我们期望抛出异常的语句周围。

      事实上,尽可能避免抛出和捕获异常是一个好主意 - 它们不仅会导致性能损失(如果在循环中调用此方法会导致严重问题),但是您可能会无意中捕获并处理异常你没有预料到的例外,掩盖了一个更严重的问题。

      在这种情况下,我们可以通过检查自己以查看public bool CheckFileType(string FileName) { if (FileName == null) { return false; } if (FileName.IndexOfAny(System.IO.Path.GetInvalidPathChars()) >= 0) { return false; } // Your original method goes here } 是否包含任何无效字符来避免完全抛出异常:

      {{1}}

答案 2 :(得分:2)

由于你实际上没有测试文件类型(只是文件名的扩展名),我首先要重新命名方法。您可以使用扩展方法来处理它:

public static bool HasImageExtension(this string fileName)
{
    try
    {
        if (fileName == null) return false;

        string[] validExtensions = new string[] { ".gif", ".jpg", ".jpeg", ".png", ".bmp" };

        string extension = Path.GetExtension(fileName);
        return validExtensions.Contains(extension);
    }
    // catch the specific exception thrown if there are 
    // invalid characters in the path
    catch (ArgumentException ex) 
    {
        // do whatever you need to do to handle 
        // the fact there are invalid chars
        throw; 
    }
}

然后你可以这样打电话:

string fileName = "testFileName.jpg";
bool hasImageExtension = fileName.HasImageExtension();

答案 3 :(得分:0)

这应该有效:

public bool CheckFileType(string FileName)
{
    try
    {
        string Ext = Path.GetExtension(FileName).ToLower();
        string[] okExt = ".gif|.jpg|.jpeg|.png|.bmp".Split('|');

        foreach(var item in okExt)
        {
            if(Ext == item)
                return true;
        }
        return false;
    }
    catch(Exception ex)
    {
        throw;
    }
}

请记住:永远不会捕获您不会处理的异常。(或至少重新抛出它们)