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

sre*_*enu 4 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;
        }

}
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Fur*_*edi 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;
     }
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 5

您可以通过多种方法在返回值的方法中使用异常:

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

T returnValue = default(T);
try
{
    // My code
}
catch 
{
    // Exception handling code
}
return returnValue;
Run Code Online (Sandbox Code Playgroud)

在您的渔获中放一个退货声明

try
{
    // My code
}
catch 
{
    // Handle exception
    return default(T);
}
Run Code Online (Sandbox Code Playgroud)

引发异常

你不具备返回一个值,该方法只需简单地结束(如达到return语句或throw语句)。根据异常,返回值并不总是有效的。

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

  1. 什么会失败?
  2. 为什么/如何失败?
  3. 他们失败了该怎么办?

在您的情况下:

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

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

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

请注意,我们只捕获了我们期望的异常(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
}
Run Code Online (Sandbox Code Playgroud)