C# 关于如何在Try/Catch异常后忽略for循环中的文件,有什么建议吗?

C# 关于如何在Try/Catch异常后忽略for循环中的文件,有什么建议吗?,c#,json,C#,Json,我确实想就这个问题征求意见。现在我有一个自定义的文件监视程序,它只监视一个文件夹,检测是否有任何.json文件并反序列化它们。但是,它有可能读取无效的,并抛出异常。我面临的问题是,由于这是一个在3秒钟内重复调用的服务,它将继续读取无效文件,并用反序列化失败的尝试填充日志 我正在寻找解决这个问题的建议,我希望在这里寻求建议 我最初的想法是,一旦发现异常,立即进行文件复制,并将其移动到另一个位置,以便服务无法监视它。但是仔细想想,我认为如果服务能够识别出无效文件,并且在监视其他文件的同时不对该文件执

我确实想就这个问题征求意见。现在我有一个自定义的文件监视程序,它只监视一个文件夹,检测是否有任何.json文件并反序列化它们。但是,它有可能读取无效的,并抛出异常。我面临的问题是,由于这是一个在3秒钟内重复调用的服务,它将继续读取无效文件,并用反序列化失败的尝试填充日志

我正在寻找解决这个问题的建议,我希望在这里寻求建议

我最初的想法是,一旦发现异常,立即进行文件复制,并将其移动到另一个位置,以便服务无法监视它。但是仔细想想,我认为如果服务能够识别出无效文件,并且在监视其他文件的同时不对该文件执行操作,那就更好了

下面是一段代码:

IENumerable<FileInfo> filesInDirectory = DirectoryInfo.GetFiles();

try {

    if(filesInDirectory.Any())
    {

        foreach(var file in filesInDirectory) 
        {

            if(file.Extension == ".json")
            {
                Logger("The file " + file.Name + " is being deserialized.");
                  //The file is read here for its contents and deserialized
            }

        }

        Logger("The file has been deserialized at " + DateTime.Now());

    }

catch 
{

//Exception handled here. Initially it was File.Copy and File.Delete(file.FullName);
}
IENumerable filesInDirectory=DirectoryInfo.GetFiles();
试一试{
if(filesInDirectory.Any())
{
foreach(filesInDirectory中的var文件)
{
if(file.Extension==“.json”)
{
记录器(“正在反序列化文件“+file.Name+”);
//在此处读取文件内容并反序列化
}
}
Logger(“该文件已在“+DateTime.Now()”反序列化);
}
抓住
{
//这里处理了异常。最初是File.Copy和File.Delete(File.FullName);
}
实际上,我的想法是在
var文件
本身上放置一个布尔值,在.json条件满足时将其标记为read,如果它抛出异常,则会将其设置为true,并将其读取和忽略。但是,鉴于
FileInfo
类是一个系统类

如果反序列化完成,文件将从目录中删除,但如果目录中保留无效文件;
Logger
是我编写的一个自定义函数,通过将消息输出到文本文件来记录服务的操作,日志文本文件将显示它一直在递归地尝试反序列化无效文件id json文件,只要它保留在文件夹中

用户可能会意外地将未映射到
Foo
对象的.json文件放入其中,我不想触摸该文件,只需跳过它即可


这超出了我的家庭作业范围,但我想知道这个想法是否可行或可实施,我真的很想看到任何关于这方面的建议或建议。

可能您需要学习如何编写防御代码,请执行以下操作:

  • 检查文件扩展名(=json)
  • 检查文件大小(!=0)
  • 使用json工具重新验证所需形状的模式(我想代码应该是.net)
  • 编写正确的catch语句,而不是catch all 请看一下用于解析的方法的文档,下面是来自
    JsonDocument.parse()
    的示例:

    在本例中,您将有3个catch语句

  • catch(JsonException je){//handle here}
  • catch(ArgumentException ae){//Handle here}
  • 捕获(异常e){//非常意外的错误}
  • 我最初的想法是立即创建一个文件。一旦捕获到异常,复制它并将其移动到另一个位置,以便服务无法监视它。但经过思考,我认为如果服务能够识别无效文件,并且在监视其他文件的同时不对所述文件执行操作,那会更好

    在消息队列处理中,无论它是MSMQ;JMS;Apache;WebSphere;都有一个消息的概念,即在一定次数的失败重试后,如果无法处理该项,则该项将被视为有毒消息,并移动到有毒消息队列,以便稍后由操作进行调查

    您可以将相同的概念应用于文件处理。如果尝试后您无法处理它,或者是因为它是一个格式错误的文件;一个报告它是JSON文件但实际上是一个错误命名为kermit.JSON的Piggy小姐的JPEG的文件;将其移到有毒文件文件夹

    你不能仅仅因为某件东西声称是某种类型的,就认为它说的是实话。换句话说:

    • 不信任文件扩展名
    • 不要相信文件大小
    • 不要假设您可以打开该文件进行读取(它可以通过NTFS进行加密)
    • 在rety工具中构建。仅仅因为第一次失败,并不意味着第二次失败。(可能该文件只是由一些简单的东西打开的,比如反病毒)

    我对C#比较陌生,防御性代码听起来很吸引人,我还试图弄清楚捕获异常是如何工作的。正确的捕获语句的上下文是什么?您从库中使用的方法将有文档显示它可能抛出什么类型的异常,这太酷了!我将在可能的时候查看并实现它!谢谢@Wandawi Najeeb R!您可以保留一个无法反序列化的文件名列表,如果文件在该列表中,您可以不重试,但如果文件被删除、替换,甚至被覆盖,您的代码将不会再次尝试读取它。@CodeCaster哇!这实际上是一个非常可行的解决方案,而且也很简单,我可以问自己为什么我没有想到这个,哈哈!如果文件不是很大,我会保留一个无效文件内容的散列,而不是文件名,以避免CodeCaster提到的问题。这将允许您重新读取和处理用相同名称修复的文件。消息队列处理?听起来非常有趣,是时候开始了