diff --git a/src/NzbDrone.Common/Disk/DestinationAlreadyExistsException.cs b/src/NzbDrone.Common/Disk/DestinationAlreadyExistsException.cs
new file mode 100644
index 000000000..986413742
--- /dev/null
+++ b/src/NzbDrone.Common/Disk/DestinationAlreadyExistsException.cs
@@ -0,0 +1,29 @@
+using System;
+using System.IO;
+using System.Runtime.Serialization;
+
+namespace NzbDrone.Common.Disk
+{
+ public class DestinationAlreadyExistsException : IOException
+ {
+ public DestinationAlreadyExistsException()
+ {
+ }
+
+ public DestinationAlreadyExistsException(string message) : base(message)
+ {
+ }
+
+ public DestinationAlreadyExistsException(string message, int hresult) : base(message, hresult)
+ {
+ }
+
+ public DestinationAlreadyExistsException(string message, Exception innerException) : base(message, innerException)
+ {
+ }
+
+ protected DestinationAlreadyExistsException(SerializationInfo info, StreamingContext context) : base(info, context)
+ {
+ }
+ }
+}
diff --git a/src/NzbDrone.Common/Disk/DiskTransferService.cs b/src/NzbDrone.Common/Disk/DiskTransferService.cs
index 7bfe67ed1..3dedc38d0 100644
--- a/src/NzbDrone.Common/Disk/DiskTransferService.cs
+++ b/src/NzbDrone.Common/Disk/DiskTransferService.cs
@@ -1,10 +1,11 @@
-using System;
+using System;
using System.IO;
using System.Linq;
using System.Threading;
using NLog;
using NzbDrone.Common.EnsureThat;
using NzbDrone.Common.EnvironmentInfo;
+using NzbDrone.Common.Exceptions;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Common.Disk
@@ -340,7 +341,7 @@ namespace NzbDrone.Common.Disk
}
else
{
- throw new IOException(string.Format("Destination already exists. [{0}] to [{1}]", sourcePath, targetPath));
+ throw new DestinationAlreadyExistsException($"Destination {targetPath} already exists.");
}
}
}
diff --git a/src/NzbDrone.Common/NzbDrone.Common.csproj b/src/NzbDrone.Common/NzbDrone.Common.csproj
index a2516ea68..83ec8fb24 100644
--- a/src/NzbDrone.Common/NzbDrone.Common.csproj
+++ b/src/NzbDrone.Common/NzbDrone.Common.csproj
@@ -92,6 +92,7 @@
+
diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs b/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs
index f2a0b9be6..648becce6 100644
--- a/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs
+++ b/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -12,6 +12,7 @@ using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Organizer;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Tv;
+using NzbDrone.Common;
namespace NzbDrone.Core.MediaFiles
{
@@ -157,7 +158,7 @@ namespace NzbDrone.Core.MediaFiles
if (!_diskProvider.FolderExists(rootFolder))
{
- throw new DirectoryNotFoundException(string.Format("Root folder '{0}' was not found.", rootFolder));
+ throw new EpisodeImport.RootFolderNotFoundException(string.Format("Root folder '{0}' was not found.", rootFolder));
}
var changed = false;
diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs
index 4694803e3..71ad64609 100644
--- a/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs
+++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/ImportApprovedEpisodes.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -12,7 +12,7 @@ using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Download;
using NzbDrone.Core.Extras;
-
+using NzbDrone.Common.Exceptions;
namespace NzbDrone.Core.MediaFiles.EpisodeImport
{
@@ -122,6 +122,16 @@ namespace NzbDrone.Core.MediaFiles.EpisodeImport
_eventAggregator.PublishEvent(new EpisodeImportedEvent(localEpisode, episodeFile, oldFiles, newDownload, downloadClientItem));
}
+ catch (RootFolderNotFoundException e)
+ {
+ _logger.Warn(e, "Couldn't import episode " + localEpisode);
+ importResults.Add(new ImportResult(importDecision, "Failed to import episode, Root folder missing."));
+ }
+ catch (DestinationAlreadyExistsException e)
+ {
+ _logger.Warn(e, "Couldn't import episode " + localEpisode);
+ importResults.Add(new ImportResult(importDecision, "Failed to import episode, Destination already exists."));
+ }
catch (Exception e)
{
_logger.Warn(e, "Couldn't import episode " + localEpisode);
diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeImport/RootFolderNotFoundException.cs b/src/NzbDrone.Core/MediaFiles/EpisodeImport/RootFolderNotFoundException.cs
new file mode 100644
index 000000000..afa918a77
--- /dev/null
+++ b/src/NzbDrone.Core/MediaFiles/EpisodeImport/RootFolderNotFoundException.cs
@@ -0,0 +1,25 @@
+using System;
+using System.IO;
+using System.Runtime.Serialization;
+
+namespace NzbDrone.Core.MediaFiles.EpisodeImport
+{
+ public class RootFolderNotFoundException : DirectoryNotFoundException
+ {
+ public RootFolderNotFoundException()
+ {
+ }
+
+ public RootFolderNotFoundException(string message) : base(message)
+ {
+ }
+
+ public RootFolderNotFoundException(string message, Exception innerException) : base(message, innerException)
+ {
+ }
+
+ protected RootFolderNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context)
+ {
+ }
+ }
+}
diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj
index f565a36bf..f9478e284 100644
--- a/src/NzbDrone.Core/NzbDrone.Core.csproj
+++ b/src/NzbDrone.Core/NzbDrone.Core.csproj
@@ -782,6 +782,7 @@
+