Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在catch-c中使用try中的对象#_C#_Exception - Fatal编程技术网

C# 如何在catch-c中使用try中的对象#

C# 如何在catch-c中使用try中的对象#,c#,exception,C#,Exception,我想在catch块中使用一个对象,这会在try块中得到一个异常。我正在将一些字符串解析为int,需要在不可能的情况下捕获异常,并查看哪一个对象出错以及在哪一行中。这可能吗 一些代码或示例。谢谢 static void Main(string[] args) { var result = Parse(new List<string>() { "3;5;7", "qwe;3;70" }); } public static List<int[]> Parse(List

我想在
catch
块中使用一个对象,这会在
try
块中得到一个异常。我正在将一些字符串解析为
int
,需要在不可能的情况下捕获异常,并查看哪一个对象出错以及在哪一行中。这可能吗

一些代码或示例。谢谢

static void Main(string[] args)
{
    var result = Parse(new List<string>() { "3;5;7", "qwe;3;70" });
}

public static List<int[]> Parse(List<string> list)
{
    try
    {
        return list.Select(str => str.Split(';'))
            .Select(str => Tuple.Create(int.Parse(str[0]), int.Parse(str[1]), int.Parse(str[2])))
            /// something happening
            .ToList();
    }
    catch
    {
        //here in braces I want to know, which element was wrong
        //"qwe" and whole line "qwe;3;70"
        throw new FormatException($"Wrong line [{}]");
    }
}
static void Main(字符串[]args)
{
var result=Parse(newlist(){“3;5;7”,“qwe;3;70”});
}
公共静态列表解析(列表)
{
尝试
{
返回列表。选择(str=>str.Split(“;”))
.Select(str=>Tuple.Create(int.Parse(str[0])、int.Parse(str[1])、int.Parse(str[2]))
///发生了什么事
.ToList();
}
抓住
{
//在大括号中,我想知道哪个元素错了
//“qwe”和全线“qwe;3;70”
抛出新的FormatException($“错误的行[{}]”);
}
}

范围就是范围。在
try
块中定义的任何内容,如果没有显式传递,将无法在
catch
块中使用


如果需要此信息,您必须手动迭代列表,并尝试逐个捕获每个尝试…

范围就是范围。在
try
块中定义的任何内容,如果没有显式传递,将无法在
catch
块中使用


如果需要此信息,您必须在列表上手动迭代,并分别尝试捕获每次尝试…

try/catch
块外声明行和值项计数器,并在LINQ表达式体中增加它们:

public static List<int[]> Parse(List<string> list)
{
    int line = 0;
    int item = 0;
    try
    {
        return list
            .Select(str => {
                line++;
                item = 0;
                return str
                    .Split(';')
                    .Select(i => { item++; return int.Parse(i); })
                    .ToArray();
            })
            .ToList();
    }
    catch
    {
        throw new FormatException($"Wrong line [{line}]; item [{item}]");
    }
}
公共静态列表解析(列表)
{
内线=0;
int项=0;
尝试
{
返回列表
.选择(str=>{
line++;
项目=0;
返回str
.Split(“;”)
.Select(i=>{item++;返回int.Parse(i);})
.ToArray();
})
.ToList();
}
抓住
{
抛出新的FormatException($“错误的行[{line}];项[{item}]”);
}
}

演示:

try/catch
块外声明行和值项计数器,并在LINQ表达式体中增加它们:

public static List<int[]> Parse(List<string> list)
{
    int line = 0;
    int item = 0;
    try
    {
        return list
            .Select(str => {
                line++;
                item = 0;
                return str
                    .Split(';')
                    .Select(i => { item++; return int.Parse(i); })
                    .ToArray();
            })
            .ToList();
    }
    catch
    {
        throw new FormatException($"Wrong line [{line}]; item [{item}]");
    }
}
公共静态列表解析(列表)
{
内线=0;
int项=0;
尝试
{
返回列表
.选择(str=>{
line++;
项目=0;
返回str
.Split(“;”)
.Select(i=>{item++;返回int.Parse(i);})
.ToArray();
})
.ToList();
}
抓住
{
抛出新的FormatException($“错误的行[{line}];项[{item}]”);
}
}

演示:

您需要对导致异常的对象的引用。然而,由于实例仅存在于try块的范围内,因此您不能再访问它(try和catch不共享相同的范围,因此无法访问相同的变量),除非您在try块之外声明对该实例的引用

如评论中所述,您应该使用普通的
foreach
-循环来访问当前行:

public static List<int[]> Parse(List<string> list)
{
    var result = new List<int[]>();
    foreach(var str in list)
    {
        try 
        {
            var values = str.Split(';');
            result.Add(Tuple.Create(
                        int.Parse(values[0]), 
                        int.Parse(values[1]), 
                        int.Parse(values[2]))
                    );
        }
        catch
        {
            //here in braces I want to know, which element was wrong
            throw new FormatException($"Wrong line " + str");
        }
    }
    return result;
}

您需要对导致异常的对象的引用。然而,由于实例仅存在于try块的范围内,因此您不能再访问它(try和catch不共享相同的范围,因此无法访问相同的变量),除非您在try块之外声明对该实例的引用

如评论中所述,您应该使用普通的
foreach
-循环来访问当前行:

public static List<int[]> Parse(List<string> list)
{
    var result = new List<int[]>();
    foreach(var str in list)
    {
        try 
        {
            var values = str.Split(';');
            result.Add(Tuple.Create(
                        int.Parse(values[0]), 
                        int.Parse(values[1]), 
                        int.Parse(values[2]))
                    );
        }
        catch
        {
            //here in braces I want to know, which element was wrong
            throw new FormatException($"Wrong line " + str");
        }
    }
    return result;
}

您的代码有太多问题,您假设参数
list
不是空的,并且包含可以拆分为3个字符串的项,并且每个字符串都可以安全地解析为
int

如果您没有上述所有保证,请检查所有内容:

public static List<int[]> Parse(List<string> list)
{
    if (list == null)
    {
        throw new ArgumentNullException(nameof(list));
    }

    var arrayOfStringArray = list
        .Select(x => x.Split(';'))
        .ToArray();
    var resultList = new List<int[]>();

    for (var i = 0; i < arrayOfStringArray.Length; i++)
    {
        var arrayOfString = arrayOfStringArray[i];

        if (arrayOfString.Length != 3)
        {
            throw new InvalidOperationException("meaningfull message there!");
        }

        var arrayOfInt = new int[3];

        for (var j = 0; j < arrayOfInt.Length; j++)
        {
            arrayOfInt[j] = TryParse(arrayOfString[j], i, j);
        }

        resultList.Add(arrayOfInt);
    }

    return resultList;
}

static int TryParse(string value, int line, int position)
{
    int result;

    if (!int.TryParse(value, out result))
    {
        throw new FormatException($"Item at position {line},{position} is invalid.");
    }

    return result;
}
公共静态列表解析(列表)
{
if(list==null)
{
抛出新ArgumentNullException(nameof(list));
}
var arrayOfStringArray=列表
.选择(x=>x.Split(“;”))
.ToArray();
var resultList=新列表();
对于(变量i=0;i
您的代码有太多问题,您假设参数
list
不是空的,并且包含可以拆分为3个字符串的项,并且每个字符串都可以安全地解析为
int

如果您没有上述所有保证,请检查所有内容:

public static List<int[]> Parse(List<string> list)
{
    if (list == null)
    {
        throw new ArgumentNullException(nameof(list));
    }

    var arrayOfStringArray = list
        .Select(x => x.Split(';'))
        .ToArray();
    var resultList = new List<int[]>();

    for (var i = 0; i < arrayOfStringArray.Length; i++)
    {
        var arrayOfString = arrayOfStringArray[i];

        if (arrayOfString.Length != 3)
        {
            throw new InvalidOperationException("meaningfull message there!");
        }

        var arrayOfInt = new int[3];

        for (var j = 0; j < arrayOfInt.Length; j++)
        {
            arrayOfInt[j] = TryParse(arrayOfString[j], i, j);
        }

        resultList.Add(arrayOfInt);
    }

    return resultList;
}

static int TryParse(string value, int line, int position)
{
    int result;

    if (!int.TryParse(value, out result))
    {
        throw new FormatException($"Item at position {line},{position} is invalid.");
    }

    return result;
}
公共静态列表解析(列表)
{
if(list==null)
{
抛出新ArgumentNullException(nameof(list));
}
var arrayOfStringArray=列表
.选择(x=>x.Split(“;”))
.ToArray();
var resultList=新列表();
对于(变量i=0;i