【问题标题】:How to do exception handling in my code如何在我的代码中进行异常处理
【发布时间】:2015-11-09 00:41:15
【问题描述】:

我刚刚学习了异常处理。所以,我还是习惯了。我知道如何进行基本的异常处理,例如输入正确的除法值并在输入错误值时抛出 DividebyZeroException。

但我需要一些帮助来执行以下操作:

创建一个异常处理以抛出错误

1) 每行的整数个数不相等 例如:Matrix = [ 3 4; 9 8 1] 应该是: matrix = [ 3 4 2; 9 8 1]

2) 分号“;”我用作分隔符的替换为无效字符,例如:matrix = [ 3 4 2 # 9 8 1]

这是我的代码:

这是我创建字符串的主要内容。

string text = "A = [8 5 5 4; 2 6 5 3; 8 5 2 6]";

这是我的课

public string[,] Matrix(string text)
{
    try
    {
        char[] splitOne = { '[', ']' };
        char[] splitTwo = { ';' };
        char[] splitThree = { ' ' };
        words = text.Split(splitOne)[1]
                               .Split(splitTwo, StringSplitOptions.RemoveEmptyEntries)
                               .Select(x => x.Split(splitThree, StringSplitOptions.RemoveEmptyEntries))
                               .ToArray();
    }
    catch
    {
        Console.WriteLine("Try entering a correct string");

    }


    string[,] matrix = new string[words.Length, words[0].Length];
    for (int i = 0; i < words.Length; ++i)
    {
        for (int j = 0; j < words[i].Length; ++j)
        {
            matrix[i, j] = words[i][j];
        }
    }

    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            Console.Write("{0} ", matrix[i, j]);
        }
        Console.WriteLine();
    }
    return matrix;
}

如何使 try and catch 起作用?这是一个基本的通用问题,但我如何使它也能满足我的以下要求。现在它没有输出我的消息。

【问题讨论】:

  • 目前您在try 内没有做任何可能失败的事情。将此添加到 try int x = int.Parse("Designed To Fail"); 然后它应该会崩溃(因为您无法将该字符串解析为 int)并在 catch 中输出您的代码。编辑: Try catch 只会捕获系统异常,而不是不会导致系统异常的逻辑错误。如果您 throw exception 例如 if(words.Length &lt; 2){ throw new Exception("too few values here"); },则例外情况
  • 我认为如果我将矩阵字符串更改为:matrix = [ 3 4 2 # 9 8 1] 它会使尝试部分失败,但事实并非如此。
  • 没错,它只是试图在 ;没有看到;并继续前进。没有实际的失败,这就像当你没有任何 x 时尝试做 String.replace('x', 'y') 它运行,什么也不做,但不会失败。你的代码是一样的。它运行,没有做你想做的事,但它也没有失败,这是因为这是你的逻辑错误,而不是系统异常,你可以做的是if(text.IndexOf('#') &gt; 0){ throw new Execption("# found, please use ;");
  • 哦。我现在明白了。这为我清除了那部分。但是那部分代码会进入 try-catch 吗?
  • 是的,你可以把它放在 try catch 中。它将做什么,如果它在字符串中找到一个#,那么它将抛出错误并强制发生捕获。请注意,它将继续,它不会再次尝试,这意味着如果它确实捕获,代码中 try/catch 下方的所有内容仍将尝试执行,并可能在空/空数组上崩溃您的程序. (越界错误)

标签: c# parsing matrix exception-handling try-catch


【解决方案1】:

您误解了Exceptions,您想使用Exceptions 作为数据结构的规则。相反,Exceptions 是在方法中发生错误时,因为您在数学运算中与0 相除。这是一个严重错误,代码不知道该做什么。

对于这个具体示例,您应该使用if 语句。因为您想应用规则并执行它,而Exceptions 不适合这些用例,如果您在哪里实现它,您需要if 语句来检查您想要应用规则的字符串是否很好按照您的标准形成,然后抛出Exception。此外,如果您正在创建库,这很有意义。

我对代码应该是什么样子的解决方案。

String text = "A = [8 5 3 4; 2 6 5 3; 8 5 2 3]";

var startIndex = text.IndexOf('[') + 1;
var length = text.IndexOf(']') - startIndex;
text = text.Substring(startIndex, length);

if(!text.Contains(";"))
{
    Console.WriteLine("malformed seperator");

    return;
}

var test = text.Split(';').Select((k, i) => new {Key = i, Value = k.Replace(" ", "").Length});


if(!test.All(x => x.Value == test.First().Value))
{
    Console.WriteLine("unbalanced array");
    return;
}

但我认为你正在让自己更加努力地工作,你的设计意味着在字符串创建中很多事情都是正确的,并且使用已经构建的矩阵库可以节省很多工作。

编辑

更新了解决方案,但我仍然认为字符串矩阵的设计迫使代码朝很多方向发展,这是不必要的。

【讨论】:

  • 这很简单,很好。但是,第二个代码是否正确?
  • 不,它没有误解矩阵定义会在我得到时间时更新它
  • 是的,我已经解决了。非常感谢您的帮助。谢谢。
  • 如果我帮助了你,我会很感激你会接受我的回答,如果你解决了它,否则你应该写下你的解决方案作为这个问题的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2012-05-10
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2017-03-29
相关资源
最近更新 更多