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