Assuming you mean that it stops executing subsequent steps and not subsequent tests. This is how a test, including a SpecFlow test, normally behaves: whenever a failure (exception) occurs in any step along the way, the test fails immediately, and the next test starts. (You can also have a BeforeScenario and AfterScenario hooks to initialize and cleanup things before and after the tests if you need to)
Note that unlike manual tests where you can use your judgement to decide whether it makes sense to continue the test or not, an automated test cannot.
If you still want the step not to fail the test, then you shouldn't put the Assert.Fail() in there. You can turn on some flag and in your last Then or
AfterScenario check that flag and fail the test.
BTW, there's no much point in catching the exception, writing to the console and then using Assert.Fail(). If you do want to fail the step in case of an exception, you can eliminate the try/catch clauses completely and simply let the exception flow back. This will have the same effect as what you're doing, in terms of failing the step. Moreover, your code swallows all of the details of the exception (it's type, message, stack-trace, inner exceptions, etc.) which can be invaluable when you come to investigate failures. Letting the exception be thrown away without catching it, retains all of this information and shows it to you in Test Explorer or wherever you see your test results.