【问题标题】:C# condition check using try catch [closed]使用 try catch 进行 C# 条件检查 [关闭]
【发布时间】:2018-02-16 23:51:52
【问题描述】:

我有一个文件名数组。如果数组中没有文件,我需要抛出异常。我可以使用 try catch 吗。任何人知道请帮助。提前致谢。

  string[] fileEntries = Directory.GetFiles(filepath, "*.csv");.
// throw an exception if no files
  if (fileEntries.Length == 0){}

【问题讨论】:

标签: c# exception try-catch


【解决方案1】:

我需要抛出一个异常。我可以使用 try catch

try/catch 块用于捕获异常并使用该信息执行某些操作。如果需要抛出异常,直接抛出即可

if (fileEntries.Length == 0)
{
     throw new Exception("No *.csv files available");
}

这个异常现在将向上抛出到调用这段代码所在的方法的方法。使用 try/catch 块,您现在可以决定要在哪个级别捕获此异常并使用该信息。

例子

void method1(){ method2(); }

void method2(){ method3(); }

void method3()
{
    string[] fileEntries = Directory.GetFiles(filepath, "*.csv");.

    if (fileEntries.Length == 0)
    {
         throw new Exception("No *.csv files available");
    }
}

如果没有被捕获,这个异常将向上传播到method1 并阻止你的程序执行/彻底中止它。您可以在此级别捕获它并(例如,如果您有一个控制台应用程序)将信息呈现给用户:

void method1()
{
    try
    {
        method2();
    }
    catch(Exception ex)
    {
          Console.WriteLine(ex.Message);
    }
}

我可以传递一个 ex obj 以添加数据以供进一步检查

查看基本Exception 的构造函数,它将允许您将string 作为信息源传递,或者将additional exception 作为内部异常传递。

编辑:

如果您按照Corak 的建议创建自己的custom exception。您可以定义自己的构造函数并传递例如enum 作为错误代码:

public enum ErrorCodes
{
    E1,
    E2,
    S4,
    P5
}
public class MyObjectTransferException : Exception
{
    public object ErrorCode { get; set; }

    public MyObjectTransferException(string message, ErrorCodes code) : base(message)
    {
        this.ErrorCode = code;
    }
}

现在在method3 中,您将完全抛出这种类型的异常:

void method3()
{
    string[] fileEntries = Directory.GetFiles(filepath, "*.csv");.

    if (fileEntries.Length == 0)
    {
         throw new MyObjectTransferException("No *.csv files available", ErrorCodes.E1);
    }
}

method1 中,您需要准确捕获此类异常:

void method1()
{
    try
    {
        method2();
    }
    catch(MyObjectTransferException ex)
    {
          Console.WriteLine(ex.Message);
          Console.WriteLine(ex.ErrorCode);
    }
}

【讨论】:

  • 嗨。谢谢你的回答。我可以通过一个 ex obj 来添加数据以供进一步检查吗?
  • @John_Snow 你能详细说明一下吗?目前还不清楚你打算做什么。
  • 我想为每种类型的异常添加一个错误代码。所以如果邮件服务器想使用 ex.data.add("Error",E1) 传递带有 ex 对象的值
  • @John_Snow 您可以使用string 来传达信息。请参阅我的编辑,但您不能将整个对象作为异常的参数传递。
  • @John_Snow - 您可能想要创建 custom exceptions。请记住,每当您已经一个异常并想要抛出一个异常时,将另一个异常作为新异常的“内部”异常。跨度>
【解决方案2】:

仅举一个例子:

if (fileEntries.Length == 0)
{
    throw new ArgumentException("FileNames array must not be empty!");
}

你必须决定抛出什么样的异常。如果 fileEntries 是您的方法的参数,ArgumentException 就可以了...

但是:我想建议不要这样做。例如,您可以返回指示成功/失败的布尔值或错误代码。检查这比在客户端的 try/catch 便宜。并且通常不赞成将异常用于控制流。

有关更多信息,请参阅https://softwareengineering.stackexchange.com/a/189225

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2013-08-08
    • 2013-10-31
    相关资源
    最近更新 更多