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

本文关键字:try catch 方法 返回值 | 更新日期: 2023-09-27 17:53:28

我正在检查注册表格中上传的图像,我需要使用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块。

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

这样做比较好,

 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;
     }

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

将返回语句置于try-catch之外例如:

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

在catch中放入return语句

try
{
    // My code
}
catch 
{
    // Handle exception
    return default(T);
}
抛出异常

不需要返回值,方法只需要结束(例如到达return语句或throw语句)。根据不同的异常,返回值并不总是有效的。

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

  1. 什么可能失败?
  2. 他们为什么会失败?
  3. 当他们失败时我该怎么办?

在你的例子中:

  1. 唯一可能失败的语句是string Ext = Path.GetExtension(FileName);,根据文档,如果FileName包含。(注意GetExtension不返回null,即使FileName是null)。
  2. 如果用户提供的字符串包含这些无效字符,则可能发生此错误。
  3. 如果发生这种情况,我想我们应该返回false,以表明路径无效(然而这取决于应用程序)。

所以我可能会像这样处理异常:

public bool CheckFileType(string FileName)
{
    string Ext;
    try
    {
        Ext = Path.GetExtension(FileName);
    }
    catch (ArgumentException ex)
    {
        return false;
    }
    // Switch statement
}

请注意,我们只捕获我们期望的异常(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
}

由于您实际上没有测试文件类型(仅测试文件名的扩展名),因此我将首先重命名该方法。您可以创建一个扩展方法来处理它:

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();

应该可以:

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;
    }
}

并且记住:永远不要捕获你不打算处理的异常。(或者至少重新抛出)